bugadani/routy

请求路由库

dev-master 2016-02-15 08:30 UTC

This package is not auto-updated.

Last update: 2024-09-24 05:00:40 UTC


README

Routy 是一个用于 PHP 的请求路由库。它旨在易于使用。

基本用法

Router 类是库的核心元素,它为大多数简单用例提供了一个简单的 API。定义路由就像调用与路由 HTTP 方法同名的方法并将路径作为参数传递一样简单。

$router = new Routy\Router();
$router->get('this/path');

可用的方法有

  • get($path)
  • post($path)
  • put($path)
  • delete($path)
  • head($path)

您还可以通过将名称包裹在花括号中(例如 {parameterName})在路由中定义参数。参数由一个名称和一个模式组成。默认情况下,参数匹配任何不是斜杠字符(/)的东西,但可以在参数定义中通过在名称后面添加所需的模式并使用冒号(;)分隔来覆盖它。参数定义遵循 PHP 内置 PREG 引擎的语法。例如,匹配单词作为参数的路线:hello/{name:\w+}

注意:路由是通过其参数模式的模式来识别的,而不是它们的名称。因此,如果它们具有不同的参数模式,则结构相似的多个路由可能相似。

使用 match(Request $request)matchCurrentRequest 来路由请求。这将抛出一个异常或返回一个包含有关匹配路由信息的 Match 实例。

使用 add,可以一次性为多个 HTTP 方法定义一个路由。为此,将所需的方法名称通过管道符('|')字符作为第一个参数传递。

$router->add('GET|POST', 'some/path');

选项

上述方法返回一个 Routy\Initializers\RouteInitializerInterface 实例,可以用来设置路由的名称、指定在路由匹配时将被调用的回调函数或设置额外的信息。

更完整的路由定义如下所示

$router->get('some/path')
       ->name('demoRoute')
       ->onMatch(function($name) { echo 'Hello ' . $name; })
       ->extras(['name' => 'World']);
  • setName($name)
  • onMatch(callback):由于使用 match 返回的 Match 对象可能比较繁琐,因此可以为每个路由提供一个回调函数,在路由匹配时将被调用。
  • extras(array $extras):以键值对的形式将额外的信息设置到路由中。

注意:为多个方法添加路由会创建多个单独的路由。因为一个路由名称不能属于多个路由,所以当使用 add 定义多个路由时,使用返回的 Initializer 设置名称将抛出异常。

路由回调

使用 onMatch 可以为路由定义回调函数。这是确定哪个路由被匹配以及应该采取什么操作的最简单方法。默认情况下,回调将接收匹配的参数(和设置在路由上的额外信息)作为参数列表。参数通过它们的名称传递,实际上是可以省略的。

$callback = function($name = 'World') {echo 'Hello, ' . $name . '!';};
$router->get('hello)')->onMatch($callback);
$router->get('hello/me)')->extras('name' => 'Daniel')->onMatch($callback);
$router->get('hello/{name)')->onMatch($callback);

参数映射是由一个 Routy\Invokers\DelegateInterface 实例完成的,并且可以通过向 onMatch 提供该接口的子类来覆盖默认行为,该子类将包装回调函数。

生成 URL

使用命名路由,Routy 还可以通过 to($routeName, array $parameters) 方法生成 URL。必须将所有路由参数作为第二个参数提供,额外的参数将作为进一步的 GET 参数附加到 URL 上。

$router->get('hello/{name}')->name('hello');
echo $router->to('hello', ['name' => 'World', 'extra' => 'hi']); //prints "hello/World?extra=hi"

资源

Routy 支持类似 Rails 的资源。资源可以通过使用 resource($name)resources($singularName, $pluralName) 定义。

关于 HHVM 的说明

Routy 在 HHVM 3.6.6 上进行了测试,发现库的基本功能正常工作,但有一个例外:由于路由生成发生在对象的析构函数中,因此在其中抛出的任何异常都会导致整个脚本崩溃。这在 PHP 中不是一个问题,但 HHVM 在这种情况实际上会引发一个致命错误,使得抛出的异常变得致命且不可捕获。