windwalker/middleware

Windwalker Middleware 包

安装: 505

依赖: 0

建议者: 0

安全: 0

星标: 1

关注者: 4

分支: 0

类型:windwalker-package

3.5.23 2019-10-26 15: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);