apinephp/dist-route

一个基于正则表达式的轻量级请求路由器,支持依赖注入

0.1.1 2019-07-20 21:18 UTC

This package is auto-updated.

Last update: 2024-09-18 08:05:46 UTC


README

一个轻量级的基于正则表达式的请求路由器,支持依赖注入,面向消费 PHP-FIG 建议的项目。

主要功能

安装

使用 composer 进行安装

composer require apinephp/dist-route

该包需要 PHP 7.2 或更高版本。

使用示例

<?php
    
require '/path/to/vendor/autoload.php';

use Apine\DistRoute\Router;

$router = new Router($container);
$router->use($middleware);
$router->map(['GET'], '/users', UserController::class . '@all');
$router->get('/user/{id:(\d+)}', UserController::class . '@one');

$response = $router->handle($serverRequest);

定义一个路由

路由通过调用路由器的映射方法(如 map())来定义

$router->map($methods, $pattern, $handler);

$methods 是一个包含一个或多个大写 HTTP 方法的列表,这些方法应匹配路由。

$pattern 定义一个占位符以匹配使用 {name} 语法,它创建一个名为 name 的占位符。可以通过在名称后写上正则表达式并跟一个冒号来更改占位符匹配的正则表达式。还可以通过在名称前添加一个问号(?)将占位符标记为可选。

$router->map(['GET'], '/user/{id}', 'handler');
$router->map(['GET'], '/user/{id:(\d+)}', 'handler');
$router->map(['GET'], '/user/{?id}', 'handler');

$handler 参数是在匹配到 ServerRequest 时应该执行的处理器。它可以是一个 MiddlewareInterface 实例、一个 Closure、一个函数名,或一个完全限定的类名和方法名,用 @ 分隔。处理器必须返回一个 ResponseInterface 实例。

简写方法

路由器提供了以下请求方法的简写方法:GETPOSTDELETEPUTOPTIONSHEADTRACE

前缀路由(子路由)

group() 方法允许在共同的前缀模式下定义多个路由。参数 $pattern 是上面定义的模式,它将被添加到子路由前。参数 $closure 是一个在路由器上下文中调用的函数。它必须接收一个参数,该参数是当前路由器的 RouterInterface 实例。

下面的代码将产生与上面示例相同的效果

$router->group('/user', function (RouterInterface $mapper) {
 $mapper->map(['GET'], '/{id}', 'handler');
 $mapper->map(['GET'], '/{id:(\d+)}', 'handler');
 $mapper->map(['GET'], '/{?id}', 'handler');
});

使用中间件

使用 use() 方法将中间件添加到路由器。中间件应该是 PSR-15 HTTP 处理器 建议中定义的 MiddlewareInterface 实例。中间件将被应用于所有正在处理的请求,无论是否找到匹配的路由。

$router->use($middleware);

分发(处理)请求

通过调用路由器的 handle() 方法来处理请求。该方法接受一个 ServerRequestInterface 实例。

如果没有路由与请求匹配,该方法将抛出 RouteNotFoundException。否则,它返回处理器的 ResponseInterface 实例。

执行优先级

路由和中间件按它们在路由器中注册的顺序进行搜索。它就像一个队列。

假设你这样注册了一个路由然后一个中间件

$router->get('/test/{number:([0-9]+)}', 'routeFunction');
$router->use($middleware);

在这个例子中,路由器首先会尝试将接收到的请求与路由匹配。如果匹配成功,路由器将执行该路由的可调用函数,然后返回其结果。否则,它将执行中间件。

因此,先定义中间件再定义路由是一个很好的想法。