一、背景
有简单的业务,性能是程序层层递进,而且每层业务重用率也高的状况下,如果依照传统所有货色都写在一个办法,无论是代码可读性,还是解耦都是比拟差的。如果这时有个管道,这个管道能够随便新增、批改就能实现一个新性能就好了。
讲到管道机制,比拟经典案例就是中间件了,也能够aop(Aspect Oriented Programming 切面编程),又能够称洋葱模式。

二、代码模仿
层层递进的各项业务

class ALogic{    public static function handle($data, $next)    {        print "开始 A 逻辑";        $ret = $next($data+1);        print "完结 A 逻辑";        return $ret;    }}class BLogic{    public static function handle($data,  $next)    {        print "开始 B 逻辑";        $ret = $next($data+1);        print "完结 B 逻辑";        return $ret;    }}class CLogic{    public static function handle($data, $next)    {        print "开始 C 逻辑";        //$data = $data+1;        $ret = $next($data+1);        print "完结 C 逻辑";        return $ret;    }}

组装成一整块

$pipes = [    ALogic::class,    BLogic::class,    CLogic::class];

调用每个办法中的专用函数handle

function sum($callable,$item){     return function ($request) use ($callable, $item) {        return $item::handle($request, $callable);    };}

实现

$arr = array_reverse($pipes);//将数组反转实现先进后出$result = array_reduce($arr,'sum',function($data){echo $data;});//返回一个闭包函数$result(1);//4

三、laravel实现
比拟经典的\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php sendRequestThroughRouter 这个办法

return (new Pipeline($this->app))                    ->send($request)//在through中传递的专用数据                    ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)//每层的判断或解决                    ->then($this->dispatchToRouter());//达到controller实现办法(这样了解可能会明确些)

一个new Pipeline发送了(send)request(through中的专用数据)申请,通过了(through)Middleware,而后(then)提交给路由