phapi / pipeline
Phapi Pipeline 是一个处理中间件队列的中间件管道。Phapi Pipeline 依赖于 PSR-7
Requires
- php: >=5.6.0
- phapi/contract: 1.*
- psr/http-message: 1.*
Requires (Dev)
- codeclimate/php-test-reporter: dev-master
- mockery/mockery: 0.9.*
- phpunit/phpunit: 4.*
This package is not auto-updated.
Last update: 2021-02-05 22:11:27 UTC
README
Phapi 严重依赖中间件。几乎所有的功能都是中间件:路由、内容协商等。
为什么使用中间件?
好处很多。中间件易于替换,从性能角度来看,如果实现得当,可以绕过许多在特定情况下不需要运行的代码,例如,如果客户端达到速率限制,则无需执行路由、分配等操作。
安装
该软件包默认由 Phapi 框架安装。可以通过使用 composer 独立安装软件包以供使用。
$ composer require phapi/pipeline:1.*
用法
通过使用 pipe()
方法将新的中间件附加到管道。
<?php $pipeline = new Phapi\Middleware\Pipeline(); $pipeline->pipe(new Middleware\Cors());
请注意,中间件将按照它们附加的顺序被调用。
中间件可以实现 Middleware 接口,但必须是可调用的。所有中间件都将使用三个参数:请求、响应和下一个。中间件应该调用 $next
变量,并传递 $request
、$response
和 $next
参数。中间件还必须返回一个响应。
一旦队列变空,将返回结果响应实例。
错误处理
实现 ErrorMiddleware 接口使管道能够处理错误。中间件必须负责错误处理并调用 prepareErrorQueue()
方法。这将触发管道的重置,并且只有添加在错误中间件之前的中间件(通常为序列化中间件和将响应发送给客户端的中间件)将被调用。
创建自己的中间件类
中间件需要一个请求、一个响应和一个回调($next
),如果中间件允许进一步处理请求,则会调用该回调。如果中间件不需要或不想允许进一步处理,则不应调用回调($next
),而应返回一个响应。注意,$next
可以是 null
。
中间件的主要任务是处理传入的请求和/或响应。中间件必须接受一个请求和一个响应(PSR-7 兼容)实例,并对其进行操作。
中间件必须将请求和响应传递给 ($next) 回调,最后要么返回 ($next) 回调的响应,要么在返回之前修改响应。
示例
<?php public function __invoke( Request $request, Response $response, callable $next) { // Do something ... return $next($request, $response, $next); }
或者
<?php public function __invoke( Request $request, Response $response, callable $next) { // Do something ... $response = $next($request, $response, $next); // Modify response ... return $response; }
如果中间件应该断开管道,例如客户端达到速率限制,它应返回一个响应而不是调用 $next
。
示例
<?php public function __invoke( Request $request, Response $response, callable $next) { if ($this->tooManyRequests()) { // Set appropriate headers and body // Return response return $response; } return $next($request, $response, $next); }
依赖注入容器
如果您实现了名为 setContainer()
的方法,管道将调用该方法并提供可用于 __invoke()
方法的依赖注入容器。
示例
<?php public function setContainer($container) { $this->container = $container; }
完整示例
以下是一个中间件应如何呈现的完整示例。当您想编写自己的中间件时,请以此示例作为起点。
<?php namespace Phapi\Middleware\Example; use Phapi\Contract\Di\Container; use Phapi\Contract\Middleware\Middleware; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; /** * Eample middleware * * @category Phapi * @package Phapi\Middleware\Example * @author Peter Ahinko <peter@ahinko.se> * @license MIT (https://open-source.org.cn/licenses/MIT) * @link https://github.com/phapi/middleware-example */ class Example implements Middleware { /** * Dependency injection container * * @var Container */ private $container; /** * Set dependency injection container * * @param Container $container */ public function setContainer(Container $container) { $this->container = $container; } /** * Invoking the middleware * * @param ServerRequestInterface $request * @param ResponseInterface $response * @param callable $next * @return ResponseInterface $response */ public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next = null) { // Do something ... // Call next middleware $response = $next($request, $response, $next); // Do something with the response ... // Return the response return $response; } }
许可协议
Phapi Middleware Pipeline 在 MIT 许可协议下授权 - 有关详细信息,请参阅 license.md 文件。
贡献
贡献、错误修复等始终受到欢迎。