遵守PSR-7和PSR-15规范的路由器。

1.2.1 2021-08-14 10:53 UTC

This package is auto-updated.

Last update: 2024-09-15 15:09:13 UTC


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}