Thinkphp6管道模式Pipeline使用
原创
©著作权归作者所有:来自51CTO博客作者廖圣平_的原创作品,请联系作者获取转载授权,否则将追究法律责任
导读
纵观网络上使用Tp的管道模式的例子非常少,都是解析在框架中中间件使用应用场景,其实在业务开发中管道模式也非常好用。
网络上大部分搜到的Laravel 的例子,但是Laravel 的例子中在Tp是无法实现的,经过摸索,终于搞定了Tp的使用
查看官网更是没有人讨论管道模式,而在Learnku 一大堆人讨论,由此说明了 框架是有可比性的。
于是我翻遍了源码,从Think 中间件的单元测试,到中间件的加载过程,终于发现了这边的格式,是长这样子的:
/**
* 解析中间件
* @access protected
* @param mixed $middleware
* @param string $type 中间件类型
* @return array
*/
protected function buildMiddleware($middleware, string $type): array
{
if (is_array($middleware)) {
[$middleware, $params] = $middleware;
}
if ($middleware instanceof Closure) {
return [$middleware, $params ?? []];
}
if (!is_string($middleware)) {
throw new InvalidArgumentException('The middleware is invalid');
}
//中间件别名检查
$alias = $this->app->config->get('middleware.alias', []);
if (isset($alias[$middleware])) {
$middleware = $alias[$middleware];
}
if (is_array($middleware)) {
$this->import($middleware, $type);
return [];
}
return [[$middleware, 'handle'], $params ?? []];
}
它这边需要传 handle
方法,一般Laravel 和其他主流的框架中的管道都是默认 handle
方法,不能说这样的设计不好,但是起码也得有个默认方法,鬼知道没有文档的情况下这样写。
准备
class Test
{
public static function handle($request,$next){
echo '我是中间件1';
$next($request);
}
}
class Test2
{
public static function handle($request,$next){
$next($request);
echo '我是中间件222';
}
}
使用
$request = new Request();
$pips[] = [\app\common\service\order\pipeline\Test::class,'handle'];
$pips[] = [\app\common\service\order\pipeline\Test2::class,'handle'];
(new Pipeline())
->send($request)
->through($pips)
->then(function ($e) {
});
案例
在订单场景的使用信用分应用场景