northwoods / router
适用于PSR-15请求处理器的快速路由器
1.1.0
2018-11-06 17:05 UTC
Requires
- php: ^7.1
- fig/http-message-util: ^1.1
- http-interop/http-factory-discovery: ^1.2
- nikic/fast-route: ^1.3
- psr/http-server-middleware: ^1.0
Requires (Dev)
- nyholm/psr7: ^1.0
- phpstan/phpstan: ^0.10.5
- phpstan/phpstan-phpunit: ^0.10.0
- phpunit/phpunit: ^7.3
- squizlabs/php_codesniffer: ^3.3
Suggests
- northwoods/broker: Simple middleware dispatcher
- northwoods/lazy-middleware: Lazy load handlers from a container
This package is auto-updated.
Last update: 2024-09-18 04:10:16 UTC
README
这是一个基于FastRoute的路由器,旨在与PSR-15中间件一起使用。
安装
使用composer(composer)安装和此包的方式最佳。
composer require northwoods/router
使用方法
该路由器实现了MiddlewareInterface
,因此可以与任何中间件分发器一起使用,例如Broker。
use Northwoods\Router\Router; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; $router = new Router(); $router->get('user.list', '/users', $userList); $router->get('user.detail', '/users/{id:\d+}', $userDetail); $router->post('user.create', '/users', $userCreate); assert($router instanceof Psr\Http\Server\MiddlewareInterface);
这是路由器的推荐使用方法,因为它确保请求被正确设置以供路由处理程序使用。通常,路由器应该是堆栈中的最后一个中间件。
如果您更喜欢在没有中间件的情况下使用路由器,则该路由器还实现了RequestHandlerInterface
,可以直接使用。
/** @var ServerRequestInterface */ $request = /* create server request */; /** @var ResponseInterface */ $response = $router->handle($request);
路由处理程序
所有路由处理程序都必须实现RequestHandlerInterface
接口。
namespace Acme; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; class UserListHandler implements RequestHandlerInterface { public function handle(ServerRequestInterface $request): ResponseInterface { /** @var array */ $users = /* load from database, etc */; return new Response(200, ['content-type' => 'application-json'], json_encode($users)); } }
如果希望延迟加载处理程序,则可以使用lazy-middleware包。
use Northwoods\Middleware\LazyHandlerFactory; /** @var LazyHandlerFactory */ $lazyHandler = /* create the factory */; $router->post('user.create', '/users', $lazyHandler->defer(CreateUserHandler::class));
反向路由
反向路由允许从路由生成URI。
$uri = $router->uri('user.detail', ['id' => 100]); assert($uri === '/users/100');
API
Router::add($name, $route);
添加一个完全构建的路由。
Router::get($name, $pattern, $handler)
添加适用于HTTP GET请求的路由。
Router::post($name, $pattern, $handler)
添加适用于HTTP POST请求的路由。
Router::put($name, $pattern, $handler)
添加适用于HTTP PUT请求的路由。
Router::patch($name, $pattern, $handler)
添加适用于HTTP PATCH请求的路由。
Router::delete($name, $pattern, $handler)
添加适用于HTTP DELETE请求的路由。
Router::head($name, $pattern, $handler)
添加适用于HTTP HEAD请求的路由。
Router::options($name, $pattern, $handler)
添加适用于HTTP OPTIONS请求的路由。
Router::process($request, $handler)
作为中间件进行路由分发。
如果找不到路由,将使用$handler
生成响应。
Router::handle($request)
为请求分发路由。
如果找不到路由,将返回HTTP 404状态的响应。
如果找到了路由,但请求方法不允许,将返回HTTP 405状态的响应。
致谢
借鉴了zend-expressive-fastroute的一些想法来处理反向路由。