Laravel 管道机制

唔系我认叻 -
Laravel 管道机制

一、背景
有复杂的业务,功能是顺序层层递进,而且每层业务重用率也高的情况下,如果按照传统所有东西都写在一个方法,无论是代码可读性,还是解耦都是比较差的。如果这时有个管道,这个管道可以随意新增、修改就能实现一个新功能就好了。
讲到管道机制,比较经典案例就是中间件了,也可以aop(Aspect Oriented Programming 切面编程),又可以称洋葱模式。
image.png

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

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)提交给路由

特别申明:本文内容来源网络,版权归原作者所有,如有侵权请立即与我们联系(cy198701067573@163.com),我们将及时处理。

laravel介绍

Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。在Laravel中已经具有了一套高级的PHP ActiveRecord实现 -- Eloquent ORM。它能方便的将“约束(constraints)”应用到关系的双方,这样你就具有了对数

Tags 标签

phplaravel

扩展阅读

加个好友,技术交流

1628738909466805.jpg