middlewares/request-handler

执行请求处理器的中间件

v2.0.2 2022-05-09 13:49 UTC

This package is auto-updated.

Last update: 2024-09-09 18:59:33 UTC


README

Latest Version on Packagist Software License Testing Total Downloads

通过路由器发现请求处理器的中间件。

要求

安装

此包可以通过 Composer 以 middlewares/request-handler 的方式安装和自动加载。

composer require middlewares/request-handler

您还可以安装任何路由中间件,例如 middlewares/fast-routemiddlewares/aura-router 用于路由。

目的

在处理路由时,通常有两个完全独立的步骤

  1. 确定请求是否有效并且可以被应用程序解析。
  2. 在应用程序内部处理请求。

第一步通常解析为一个路由回调,而第二步的产物通常是执行该回调的结果。

在第一步和第二步之间可能会发生很多事情:输入验证、身份验证、授权等,在某些场景下,我们可能不希望继续处理请求(例如,身份验证、访问数据库资源等),如果这最终会导致失败,例如生成一个 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'));

当请求处理器被调用时,它期望定义一个包含处理器引用的请求属性。处理器必须是字符串、可调用或实现 MiddlewareInterfaceRequestHandlerInterface 的对象。如果它是字符串,将使用 ContainerInterface 来解析它并获取要使用的 MiddlewareInterfaceRequestHandlerInterface。如果它是可调用的,它将自动转换为 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)。请参阅许可证获取更多信息。