middlewares / request-handler
执行请求处理器的中间件
Requires
- php: ^7.2 || ^8.0
- middlewares/utils: ^3.0
- psr/container: ^1.0||^2.0
- psr/http-server-middleware: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.0
- laminas/laminas-diactoros: ^2.3
- oscarotero/php-cs-fixer-config: ^1.0
- phpstan/phpstan: ^0.12
- phpunit/phpunit: ^8|^9
- squizlabs/php_codesniffer: ^3.0
README
通过路由器发现请求处理器的中间件。
要求
- PHP >= 7.2
- 一个 PSR-7 http 库
- 一个 PSR-15 中间件分发器
- 可选,一个 PSR-11 容器来解析路由处理器
安装
此包可以通过 Composer 以 middlewares/request-handler 的方式安装和自动加载。
composer require middlewares/request-handler
您还可以安装任何路由中间件,例如 middlewares/fast-route 或 middlewares/aura-router 用于路由。
目的
在处理路由时,通常有两个完全独立的步骤
- 确定请求是否有效并且可以被应用程序解析。
- 在应用程序内部处理请求。
第一步通常解析为一个路由回调,而第二步的产物通常是执行该回调的结果。
在第一步和第二步之间可能会发生很多事情:输入验证、身份验证、授权等,在某些场景下,我们可能不希望继续处理请求(例如,身份验证、访问数据库资源等),如果这最终会导致失败,例如生成一个 HTTP 400 错误。
将路由与请求处理分开,使我们能够在这些步骤之间使用任何中间件。这也使得 request-handler
中间件能够与任何路由组件一起使用。
示例
路由中间件需要在处理请求之前被调用。在这个例子中,我们将使用 fast-route
中间件。
// Create the routing dispatcher $fastRouteDispatcher = FastRoute\simpleDispatcher(function (FastRoute\RouteCollector $r) { $r->get('/hello/{name}', HelloWorldController::class); }); $dispatcher = new Dispatcher([ new Middlewares\FastRoute($fastRouteDispatcher), // ... new Middlewares\RequestHandler(), ]); $response = $dispatcher->dispatch(new ServerRequest('/hello/world'));
当请求处理器被调用时,它期望定义一个包含处理器引用的请求属性。处理器必须是字符串、可调用或实现 MiddlewareInterface
或 RequestHandlerInterface
的对象。如果它是字符串,将使用 ContainerInterface
来解析它并获取要使用的 MiddlewareInterface
或 RequestHandlerInterface
。如果它是可调用的,它将自动转换为 MiddlewareInterface
使用 Middlewares\Utils\CallableHandler
// Use a PSR-11 container to create the intances of the request handlers $container = new RequestHandlerContainer(); $dispatcher = new Dispatcher([ // ... new Middlewares\RequestHandler($container), ]);
用法
如果处理器作为字符串(或包含两个字符串的数组)提供,请定义用于解析处理器的容器。默认情况下将使用 Middlewares\Utils\RequestHandlerContainer
。
// Use the default PSR-11 container to create the intances of the request handlers $handler = new Middlewares\RequestHandler(); // Use a custom PSR-11 container $container = new RequestHandlerContainer(); $handler = new Middlewares\RequestHandler($container);
handlerAttribute
配置用于在服务器请求中获取处理器引用的属性名称。默认为 request-handler
。
Dispatcher::run([ (new Middlewares\RequestHandler())->handlerAttribute('route'), ]);
continueOnEmpty
如果服务器请求属性为空或不存在,则抛出异常。此函数更改此行为以继续下一个中间件。
Dispatcher::run([ //Try this, and if it's empty, continue (new Middlewares\RequestHandler())->continueOnEmpty(), //So we can try that (new Middlewares\RequestHandler())->handlerAttribute('other'), ]);
有关最近更改的更多信息,请参阅 CHANGELOG,有关贡献的详细信息,请参阅 CONTRIBUTING。
MIT许可证(MIT)。请参阅许可证获取更多信息。