windwalker / middleware
Windwalker Middleware 包
3.5.23
2019-10-26 15:42 UTC
Requires
- php: >=7.1.3
Requires (Dev)
- windwalker/http: ~3.0
- windwalker/test: ~3.0
Suggests
- psr/http-message: Install 1.* to support Psr7MiddlewareInterface.
- 3.x-dev
- dev-master / 3.x-dev
- 3.5.23
- 3.5.22
- 3.5.21
- 3.5.20
- 3.5.19
- 3.5.18
- 3.5.17
- 3.5.16
- 3.5.15
- 3.5.14
- 3.5.13
- 3.5.12
- 3.5.11
- 3.5.10
- 3.5.9
- 3.5.8
- 3.5.7
- 3.5.6
- 3.5.5
- 3.5.4
- 3.5.3
- 3.5.2
- 3.5.1
- 3.5
- 3.4.9
- 3.4.8
- 3.4.7
- 3.4.6
- 3.4.5
- 3.4.4
- 3.4.3
- 3.4.2
- 3.4.1
- 3.4
- 3.3.2
- 3.3.1
- 3.3
- 3.2.8
- 3.2.7
- 3.2.6
- 3.2.5
- 3.2.4
- 3.2.3
- 3.2.2
- 3.2.1
- 3.2
- 3.1.6
- 3.1.5
- 3.1.4
- 3.1.3
- 3.1.2
- 3.1.1
- 3.1
- 3.0.1
- 3.0
- 3.0-beta2
- 3.0-beta
- 2.1.9
- 2.1.8
- 2.1.7
- 2.1.6
- 2.1.5
- 2.1.4
- 2.1.2
- 2.1.1
- 2.1
- 2.0.9
- 2.0.8
- 2.0.7
- 2.0.6
- 2.0.5
- 2.0.4
- 2.0.3
- 2.0.2
- 2.0.1
- 2.0.0
- 2.0.0-beta2
- 2.0.0-beta1
- 2.0.0-alpha
- 1.0.3
- 1.0.2
- 1.0.1
- 1.0.0
- dev-test
This package is auto-updated.
Last update: 2024-09-18 14:46:42 UTC
README
Windwalker Middleware 是一个简单且优雅的 PHP 中间件库,帮助您将中间件模式集成到项目中。
通过 Composer 安装
将以下内容添加到您的 composer.json
文件的 require 块中。
{ "require": { "windwalker/middleware": "~3.0" } }
入门指南
基本示例
这是使用中间件封装逻辑的简单方法。
use Windwalker\Middleware\CallbackMiddleware; use Windwalker\Middleware\AbstractMiddleware; class TestA extends AbstractMiddleware { /** * call * * @return mixed */ public function call() { echo ">>> AAAA\n"; $this->next->call(); echo "<<< AAAA\n"; } } class TestB extends AbstractMiddleware { /** * call * * @return mixed */ public function call() { echo ">>> BBBB\n"; $this->next->call(); echo "<<< BBBB\n"; } } $a = new TestA; $a->setNext(new TestB); $a->call();
结果应该是
>>> AAAA
>>> BBBB
<<< BBBB
<<< AAAA
回调中间件
如果您不想创建一个类,想在运行时设置一个中间件,可以使用 CallbackMiddleware
$a = new TestA; $b = new TestB; $a->setNext($b); $b->setNext(new CallbackMiddleware( function($next) { echo ">>>CCCC\n"; echo "<<<CCCC\n"; } )); $a->call();
结果应该是
>>> AAAA
>>> BBBB
>>> CCCC
<<< CCCC
<<< BBBB
<<< AAAA
CallbackMiddleware
支持在构造函数中作为 next 的第二个参数
$ware = new CallbackMiddleware( function($next) { echo ">>>CCCC\n"; $next->call(); echo "<<<CCCC\n"; }, new NextMiddleware )
结束链式调用
如果一个中间件调用 next,我们必须确保存在下一个中间件,否则我们会返回错误。
class TestB extends Middleware { /** * call * * @return mixed */ public function call() { echo ">>> BBBB\n"; $this->next->call(); echo "<<< BBBB\n"; } } $b = new TestB; $b->call(); // Error, next not exists.
但是,是的,我们可以在最后一个元素中设置一个黑洞中间件,当上一个类调用它时,什么也不做,使用 EndMiddleware
$b = new TestB; $b->setNext(new EndMiddleware); $b->call();
结果仍然如下
>>> BBBB
<<< BBBB
链式构建器
我们可以使用 ChainBuilder
来链式多个中间件。
use Windwalker\Middleware\Chain\ChainBuilder; $chain = new ChainBuilder; $chain ->add('TestA') ->add(new TestB) ->add(function($next) { echo ">>>CCCC\n"; echo "<<<CCCC\n"; }); $chain->call();
结果仍然
>>> AAAA
>>> BBBB
>>> CCCC
<<< CCCC
<<< BBBB
<<< AAAA
Psr7 中间件
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Windwalker\Middleware\Chain\Psr7ChainBuilder; use Windwalker\Middleware\Psr7Middleware; class MyPsr7Middleware implements \Windwalker\Middleware\Psr7InvokableInterface { public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next = null) { // Do something $result = $next($request, $response); // Do something return $result; } } $mid = new Psr7Middleware(function (ServerRequestInterface $request, ResponseInterface $response, $next = null) { // Do something }); $chain = new Psr7ChainBuilder; $chain->add(new MyPsr7Middleware) ->add($mid); $chain->execute(new ServerRequest, new Response);