phossa2 / middleware
PHP 的另一个酷炫中间件运行库。
Requires
- php: ~5.4|~7.0
- container-interop/container-interop: ~1.0
- phossa2/shared: ^2.0.21
- psr/http-message-implementation: ^1.0.0
Requires (Dev)
- phpunit/phpunit: 4.*
- squizlabs/php_codesniffer: 2.*
- zendframework/zend-diactoros: ^1.3.0
Suggests
- phossa2/di: Allows PSR compatible container
- phossa2/route: Allows routing middleware
- zendframework/zend-diactoros: Allows using PSR-7 HTTP messages
Replaces
- phossa/phossa-middleware: *
This package is not auto-updated.
Last update: 2020-01-24 16:24:12 UTC
README
请使用 phoole/middleware 库代替
phossa2/middleware 是 PHP 的另一个酷炫中间件运行库。
它需要 PHP 5.4,支持 PHP 7.0+ 和 HHVM。它符合 PSR-1、PSR-2、PSR-3、PSR-4、PSR-7 以及提议的 PSR-5
为什么还需要另一个中间件运行器?
-
它最初是为了成为一个兼容 PSR-15 的中间件运行器。但我们不喜欢 PSR-15 的单次遍历方法。因此,它变成了一个双遍历和 PSR-15 风格的库。
-
采用了来自 woohoolabs/harmony 的
condition
的良好特性。但我们不认同它与分发器的紧密绑定。 -
一些仅在此库中独特的酷炫特性。
安装
通过 composer
工具安装。
composer require "phossa2/middleware"
或者将以下行添加到您的 composer.json
{ "require": { "phossa2/middleware": "2.*" } }
特性
-
能够使用大多数现有的双遍历中间件。
-
能够将一个中间件队列(一组中间件)作为通用中间件用于另一个(或主)队列。
-
能够根据 condition 条件有条件地执行一个中间件或子队列。
-
能够进入子队列并在子队列完成后终止。
使用
创建中间件队列,然后处理所有中间件。
use Phossa2\Middleware\Queue; use Zend\Diactoros\Response; use Zend\Diactoros\ServerRequestFactory; // create middleware queue $mws = new Queue([ new LoggerMiddleware(), new DispatcherMiddleware() ]); // process the queue $response = $mws->process(ServerRequestFactory::fromGlobals(), new Response());
或者在实例化后将其添加到队列中,
$mws = (new Queue()) ->push(new LoggerMiddleware()) ->push(new DispatcherMiddleware());
高级
-
支持以下签名的 PSR-7 双遍历中间件:
use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; function ( RequestInterface $request, ResponseInterface $response, callable $next ) : ResponseInterface { // ... }
许多现有的中间件可以在不修改的情况下使用,例如 psr7-middlewares。
-
Phossa2\Middleware\Queue
实现了Phossa2\Middleware\Interfaces\MiddlewareInterface
接口,因此队列本身可以用作通用中间件。// subqueue $subQueue = new Queue([ new ResponseTimeMiddleware(), new LoggingMiddleware(), // ... ]); // main middleware queue $mws = new Queue([ $subQueue, new DispatcherMiddleware(), // ... ]); $response = $mws->process(ServerRequestFactory::fromGlobals(), new Response());
-
一个
condition
是一个具有以下签名的可调用对象:function (RequestInterface $request, ResponseInterface $response) : bool { // ... }
或者是一个
Phossa2\Middleware\Interfaces\ConditionInterface
的实例。条件可以附加到中间件或子队列。只有当条件评估为
TRUE
时,中间件才会执行。// add condition during instantiation $mws = new Queue([ [$subQueue, new DebugTurnedOnCondition()], new DispatcherMiddleware(), ]); // or during the push $mws->push(new AuthMiddleware(), new PathPrefixCondition('/user'));
-
有时,用户希望在子队列完成后立即终止整个中间件处理,而不是继续处理父队列。
// use terminatable queue $tQueue = new TerminateQueue([...]); $mws = new Queue([ [$tQueue, new SomeCondition()], // execute & terminate if condition true $mw2, $mw3, // ... ]); $response = $mws->process($request, $response);
变更日志
请参阅 CHANGELOG 获取更多信息。
测试
$ composer test
贡献
请参阅 CONTRIBUTE 获取更多信息。
依赖
-
PHP >= 5.4.0
-
phossa2/shared >= 2.0.21
-
一个 PSR-7 HTTP 消息实现,例如 zend-diactoros