导读

纵观网络上使用Tp的管道模式的例子非常少,都是解析在框架中中间件使用应用场景,其实在业务开发中管道模式也非常好用。
网络上大部分搜到的Laravel 的例子,但是Laravel 的例子中在Tp是无法实现的,经过摸索,终于搞定了Tp的使用

Thinkphp6管道模式Pipeline使用_Laravel

查看官网更是没有人讨论管道模式,而在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';
}


}
class Request
{


}

使用

$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) {

});

案例

​​在订单场景的使用​​​信用分应用场景​