yiisoft / middleware-dispatcher
PSR-15 中间件分发器
Requires
- php: ^8.0
- psr/container: ^1.0|^2.0
- psr/event-dispatcher: ^1.0
- psr/http-message: ^1.0|^2.0
- psr/http-server-handler: ^1.0
- psr/http-server-middleware: ^1.0
- yiisoft/definitions: ^2.0|^3.0
- yiisoft/friendly-exception: ^1.1
- yiisoft/injector: ^1.0
Requires (Dev)
- maglnet/composer-require-checker: ^4.2
- nyholm/psr7: ^1.4
- phpunit/phpunit: ^9.5
- rector/rector: ^0.18.0
- roave/infection-static-analysis-plugin: ^1.18
- spatie/phpunit-watcher: ^1.23
- vimeo/psalm: ^4.30|^5.3
- yiisoft/test-support: ^1.3
This package is auto-updated.
Last update: 2024-09-05 06:32:41 UTC
README
Yii 中间件分发器
该包是一个 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 );
在上面的 $diContainer
是 PSR-11 \Psr\Container\ContainerInterface
的实例,而 $eventDispatcher
是 PSR-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, ], ]
处理程序操作和可调用类型参数将自动使用依赖注入容器进行注入。当前请求和处理程序可以通过对 ServerRequestInterface
和 RequestHandlerInterface
进行类型提示来获取。
定义中间件集合后,您可以进行分发
$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 软件 维护。