tobento / service-middleware
一个具有自动装配和别名支持的PSR-15中间件分发器。
1.0.7
2024-08-13 13:51 UTC
Requires
- php: >=8.0
- psr/container: ^2.0
- psr/http-message: ^1.0
- psr/http-server-handler: ^1.0
- psr/http-server-middleware: ^1.0
- tobento/service-autowire: ^1.0
Requires (Dev)
- laminas/laminas-httphandlerrunner: ^1.4
- nyholm/psr7: ^1.4
- phpunit/phpunit: ^9.5
- tobento/service-container: ^1.0
- vimeo/psalm: ^4.0
README
一个具有自动装配和别名支持的PSR-15中间件分发器。
目录
入门
使用以下命令添加运行中间件服务的最新版本。
composer require tobento/service-middleware
要求
- PHP 8.0或更高版本
亮点
- 框架无关,与任何项目兼容
- 解耦设计
- 自动装配中间件
- 别名中间件
文档
创建中间件分发器
use Tobento\Service\Middleware\MiddlewareDispatcher; use Tobento\Service\Middleware\AutowiringMiddlewareFactory; use Tobento\Service\Middleware\FallbackHandler; use Tobento\Service\Container\Container; use Nyholm\Psr7\Factory\Psr17Factory; // create middleware dispatcher. $dispatcher = new MiddlewareDispatcher( new FallbackHandler((new Psr17Factory())->createResponse(404)), new AutowiringMiddlewareFactory(new Container()) // any PSR-11 container );
new
您可以使用new
方法创建一个新实例。它将保留添加的别名。
$newDispatcher = $dispatcher->new();
添加中间件
通过匿名函数
use Psr\Http\Server\RequestHandlerInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; $dispatcher->add(function(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { return $handler->handle($request); });
通过类实例
use Psr\Http\Server\RequestHandlerInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Server\MiddlewareInterface; class Middleware implements MiddlewareInterface { public function process( ServerRequestInterface $request, RequestHandlerInterface $handler ): ResponseInterface { $response = $handler->handle($request); $response->getBody()->write('Hello word'); return $response; } } $dispatcher->add(new Middleware());
通过类名
use Psr\Http\Server\RequestHandlerInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Server\MiddlewareInterface; class Middleware implements MiddlewareInterface { public function process( ServerRequestInterface $request, RequestHandlerInterface $handler ): ResponseInterface { $response = $handler->handle($request); $response->getBody()->write('Hello word'); return $response; } } $dispatcher->add(Middleware::class);
通过类名与内置参数(无法通过自动装配解析)
use Psr\Http\Server\RequestHandlerInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Server\MiddlewareInterface; class Middleware implements MiddlewareInterface { public function __construct( protected string $name, ) {} public function process( ServerRequestInterface $request, RequestHandlerInterface $handler ): ResponseInterface { $response = $handler->handle($request); $response->getBody()->write('Hello '.$this->name); return $response; } } $dispatcher->add([Middleware::class, 'name' => 'Sam']);
一次性添加多个
use Psr\Http\Server\RequestHandlerInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Server\MiddlewareInterface; class Middleware implements MiddlewareInterface { public function __construct( protected string $name, ) {} public function process( ServerRequestInterface $request, RequestHandlerInterface $handler ): ResponseInterface { $response = $handler->handle($request); $response->getBody()->write('Hello '.$this->name); return $response; } } $dispatcher->add( [Middleware::class, 'name' => 'Sam'], function(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { return $handler->handle($request); }, );
别名
您可能想使用别名而不是类名
// add single alias. $dispatcher->addAlias('alias', Middleware::class); // add multiple alias. $dispatcher->addAliases([ 'alias' => Middleware::class, ]); // add middleware by alias. $dispatcher->add('alias'); // if you have not resolvable parameters: $dispatcher->add(['alias', 'name' => 'Sam']);
分组
您可能想添加一组中间件
$dispatcher->addGroup(name: 'api', middlewares: [ Middleware::class, // with build-in parameters: [AnotherMiddleware::class, 'name' => 'Sam'], // by alias: 'aliasedMiddleware', // by class instance: new SomeMiddleware(), ]); // add middlewares by group: $dispatcher->add('api');
堆栈优先级
您可能想通过以下方式优先排序中间件的执行顺序
// highest number first. $dispatcher->add(Middleware::class, priority: 100); $dispatcher->add(AnotherMiddleware::class, priority: 200);
分发
use Nyholm\Psr7\Factory\Psr17Factory; $request = (new Psr17Factory())->createServerRequest('GET', 'https://example.com'); $response = $dispatcher->handle($request);