slightly-interactive / router
Requires
- php: >=7.1
- phpunit/phpunit: ^9.2
- psr/container: ^1.0
- psr/http-message: ^1.0
- psr/http-server-handler: ^1.0
- psr/http-server-middleware: ^1.0
README
概述
Router是一个HTTP请求路由器,使用PSR-7请求和响应,并将请求委托给PSR-15中间件和请求处理器。它需要一个PSR-11依赖注入容器。
用法
实例化路由器
$router = new Router();
给它一个PSR-11依赖注入容器
$router->setDI($myContainer);
配置路由
$router->map('get', '/home', HomeController::class);
您可以为单个路由设置单个中间件处理器
$router->map('get', '/home', HomeController::class)
->middleware(MyMiddleware::class);
您还可以创建中间件组并将其添加到路由中
$router->middleware('common')
->add(CommonMiddleware1::class)
->add(CommonMiddleware2::class);
$router->map('get', '/home', HomeController::class)
->middlewareGroup('common')
->middleware(MyMiddleware::class);
组不必存在,让您可以为一系列路由切换一组中间件
if ($condition) {
$router->middleware('option1')
->add(OptionalMiddleware1::class)
->add(OptionalMiddleware2::class);
}
$router->map('get', '/route1', Route1Controller::class)
->middlewareGroup('option1');
$router->map('get', '/route2', Route2Controller::class)
->middlewareGroup('option2');
实现接受middleware
作为middlewareGroup
的简称,仅当该组已经存在且依赖注入容器中没有具有该名称的命名实例时。否则,路由器无法区分依赖注入容器中的命名实例和组名。这个简称将在未来的版本中删除。
您还可以设置全局中间件组。这些将在所有请求中运行
$router->middleware()
->add(GlobalMiddleware1::class)
->add(GlobalMiddleware2::class);
路由匹配规则
精确匹配
Router::map的第二个参数是一个字符串,它将与请求URI的路径部分进行匹配。
在最简单的情况下,它可以是一个精确的字符串匹配
/an/example/exact/path/match
这将匹配路径,无论主机、方案、查询字符串或片段。
参数匹配
在匹配参数时,我们将路径分割成由斜杠分隔的部分。任何以{
开头并以}
结尾的整个部分可以匹配URI路径相应部分的任何值。例如
/entries/{year}/{month}/{day}
将匹配/entries/2021/08/14
并将修改请求以包含属性
'year' => '2021'
'month' => '08'
'day' => '14'
请注意,只有完整的路径部分可以进行匹配,而不是部分匹配。以下都不是有效的
/blah{suffix}
/{prefix}blah
/bl{infix}ah
/{slash/inside}
多参数匹配
使用*
作为匹配部分允许匹配请求URI路径的任意多个部分。
/blah/*
将匹配/blah/a/b/c
并创建以下属性
'*0' => [ 'a', 'b', 'c' ]
可以使用多个通配符。它们将产生具有递增名称的属性
/blah/*/x/*
将匹配/blah/a/b/x/c/d
并创建以下属性
'*0' => [ 'a', 'b' ]
'*1' => [ 'c', 'd' ]
可以混合使用单参数和多参数。单参数可以直接位于多参数之前,但不能直接位于其后,例如/blah/{param1}/*/x/{param2}
将匹配/blah/a/b/c/x/y
并创建属性
'param1' => 'a'
'*0' => [ 'b', 'c' ]
'param2' => 'y'
但/blah/*/{param}
永远不会匹配任何内容,因为任何URI路径的最后一部分都将匹配*
而不会匹配{param}
。