yiisoft/middleware-dispatcher

PSR-15 中间件分发器

5.2.0 2023-09-25 07:01 UTC

README

Yii

Yii 中间件分发器


Latest Stable Version Total Downloads Build status Code Coverage Mutation testing badge static analysis type-coverage psalm-level

该包是一个 PSR-15 中间件分发器。给定一组中间件和请求实例,分发器执行它并生成响应实例。

要求

  • PHP 8.1 或更高版本。

安装

可以使用 Composer 安装此包

composer require yiisoft/middleware-dispatcher

通用用法

要使用分发器,您需要首先创建它

use Yiisoft\Middleware\Dispatcher\MiddlewareDispatcher;
use Yiisoft\Middleware\Dispatcher\MiddlewareFactory;

$dispatcher = new MiddlewareDispatcher(
    new MiddlewareFactory($diContainer),
    $eventDispatcher
);

在上面的 $diContainerPSR-11 \Psr\Container\ContainerInterface 的实例,而 $eventDispatcherPSR-14 Psr\EventDispatcher\EventDispatcherInterface 的实例。

在获得分发器实例后,应向其中提供一些中间件

$dispatcher = $dispatcher->withMiddlewares([
    TeapotAccessChecker::class,
    static function (): ResponseInterface {
        return new Response(418);
    },
]);

在上面的示例中,我们使用了回调。总体上,以下选项是可用的

  • 控制器处理程序操作,格式为 [TestController::class, 'index']。将创建 TestController 实例并执行 index() 方法。

  • PSR-15 中间件类的名称。将从容器中获取中间件实例。

  • PSR-15 请求处理器类的名称。将从容器中获取请求处理器实例并执行。

  • 可调用类的名称或实例。如果提供了可调用类的名称,将从容器中获取实例并执行。

  • 返回中间件的函数

    static function (): MiddlewareInterface {
        return new TestMiddleware();
    }

    返回的中间件将被执行。

  • 回调 function(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface

  • 中间件的数组定义(请参阅语法

    [
        'class' => MyMiddleware::class,
        '__construct()' => [
            'someVar' => 42,
        ],
    ]

处理程序操作和可调用类型参数将自动使用依赖注入容器进行注入。当前请求和处理程序可以通过对 ServerRequestInterfaceRequestHandlerInterface 进行类型提示来获取。

定义中间件集合后,您可以进行分发

$request = new ServerRequest('GET', '/teapot');
$response = $dispatcher->dispatch($request, $this->getRequestHandler());

给定请求,分发器将执行集合中的中间件并生成响应。首先指定的中间件将被首先执行。对于每个中间件,将触发 \Yiisoft\Middleware\Dispatcher\Event\BeforeMiddleware\Yiisoft\Middleware\Dispatcher\Event\AfterMiddleware 事件。

创建自己的参数解析器实现

可以通过提供自己的 ParametersResolverInterface 实现来定制参数解析器

use \Psr\Http\Message\ServerRequestInterface;
use \Yiisoft\Middleware\Dispatcher\ParametersResolverInterface;

class CoolParametersResolver implements ParametersResolverInterface
{
    public function resolve(array $parameters, ServerRequestInterface $request): array
    {
        $resolvedParameters = [];
        foreach ($parameters as $name => $parameter) {
            if ($request->getAttribute($name) !== null) {
                $resolvedParameters[$name] = $request->getAttribute($name)
            }
        }
        
        return $resolvedParameters;
    }
}

然后可以像以下那样使用它

use Psr\Container\ContainerInterface;
use Yiisoft\Middleware\Dispatcher\MiddlewareDispatcher;
use Yiisoft\Middleware\Dispatcher\MiddlewareFactory;
use Yiisoft\Middleware\Dispatcher\ParametersResolverInterface;

/** 
 * @var ContainerInterface $container
 * @var ParametersResolverInterface $resolver
 * @var EventDispatcherInterface $eventDispatcher 
 */
$dispatcher = new MiddlewareDispatcher(new MiddlewareFactory($container, $resolver), $eventDispatcher);

要组合多个参数解析器,请使用 CompositeParametersResolver

use Psr\Container\ContainerInterface;
use Psr\EventDispatcher\EventDispatcherInterface;
use Yiisoft\Middleware\Dispatcher\CompositeParametersResolver;
use Yiisoft\Middleware\Dispatcher\MiddlewareDispatcher;
use Yiisoft\Middleware\Dispatcher\MiddlewareFactory;
use Yiisoft\Middleware\Dispatcher\ParametersResolverInterface;

/** 
 * @var ContainerInterface $container
 * @var ParametersResolverInterface $resolver1
 * @var ParametersResolverInterface $resolver2
 * @var EventDispatcherInterface $eventDispatcher 
 */
$dispatcher = new MiddlewareDispatcher(
    new MiddlewareFactory($container, new CompositeParametersResolver($resolver1, $resolver2)), 
    $eventDispatcher,
);

文档

如果您需要帮助或有问题,可以在 Yii 论坛 中找到。您还可以查看其他 Yii 社区资源

许可证

Yii 中间件分发器是免费软件。它根据 BSD 许可证的条款发布。有关更多信息,请参阅 LICENSE

Yii 软件 维护。

支持项目

Open Collective

关注更新

Official website Twitter Telegram Facebook Slack