bugadani / routy
请求路由库
Requires
- php: >=5.4
- phpunit/phpunit: 4.*
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 在这种情况实际上会引发一个致命错误,使得抛出的异常变得致命且不可捕获。