我们来看一下laravel管道的拼接方式, 欢迎讨论

关于管道的概念

管道:顾名思义,将一种物质通过一根管材进行传递直到最终容器.
现实中使用管道最多的地方其实是化工厂, 本人有幸毕业的时候在实验室待过1年左右, 所以还是知道管道的样子的, 管道无论长短, 单独一根管道长度总是有限的,所以管道拼接是十分必要的, 另外,管道拼接的作用不仅是为了达成管道长度以及运输的目的, 不同的管道其实可以类比为一个特定功能的容器,经过不同管道阶段的处理,将原料发酵,达成最终目的.

来看下面一段代码
// 闭包累计 类似于管道拼接

$closure_set = array_reduce([1, 2], function ($carry, $item) {
 return  function($target) use ($carry, $item) {
     return  $carry($target  .  $item);
 };
}, function ($target) {
     return  $target;
});
$res = $closure_set('hi');

大家可以猜一下运行结果吗? 可以先猜一个结果,然后再去运行代码获取结果.

欢迎大家来讨论.~

这里应要求贴一下Laravel中实现管道的代码位置:
应用管道的位置,其实是处理请求
vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php
我们来看一下laravel管道的拼接方式, 欢迎讨论

这里是实现的位置:vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
我们来看一下laravel管道的拼接方式, 欢迎讨论

我们来看一下laravel管道的拼接方式, 欢迎讨论


当闭包开始嵌套,地狱也在逐渐形成. –鲁迅

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 33

这个太绕了):

2年前 评论
柠檬K (楼主) 2年前

答案是hi21 嘿嘿嘿

2年前 评论
WadeYu 2年前
柠檬K (作者) (楼主) 2年前

当闭包开始嵌套,地狱也在逐渐形成 :joy:

2年前 评论
柠檬K (楼主) 2年前

当闭包开始嵌套,地狱也在逐渐形成 :sweat_smile:

2年前 评论
柠檬K (楼主) 2年前
sanders

还好,为了能串起来不同的 package 我们已经基本适应管道开发了,laravel 的中间件就是管道实现的。

2年前 评论
柠檬K (楼主) 2年前

卷起来了

2年前 评论
柠檬K (楼主) 2年前
pndx

日了狗了。。。。。。

2年前 评论
柠檬K (楼主) 2年前
pndx (作者) 2年前
柠檬K (楼主) 2年前
柠檬K (楼主) 2年前
pndx (作者) 2年前

人麻了

2年前 评论
柠檬K (楼主) 2年前

如果只需要简单的管道,直接 foreach 也就可以了。

Laravel 这种套闭包的方式的可以用来做 前置、后置处理。

2年前 评论
柠檬K (楼主) 2年前
pndx 2年前

一、$closure_set:

初始值为:function ($target) {return $target;}

function ($target) use ($carry, $item) {return $carry($target . $item); //$item的值为1, $carry = function($target) {return $target}}; //使用’c'指代这个整体

function ($target) use ($carry, $item) {return $carry($target . $item);//$item的值为2, $carry = c, c为上面的值};

二、 执行$closure_set('hi'):

执行 function ('hi') use (c, 2) 得到 c('hi2')

执行 function ('hi2') use (function ($target) {return $target;}, 1) 得到 'hi21'

三、总结:这是闭包嵌套的问题

2年前 评论
柠檬K (楼主) 2年前
pndx 2年前
pndx

@柠檬K

public function then(Closure $destination)
    {
        // 这里为什么要反转$this->pipes()
        $pipeline = array_reduce(
            array_reverse($this->pipes()), $this->carry(), $this->prepareDestination($destination)
        );

        return $pipeline($this->passable);
    }

还有就是carry()里面$stack, $pipe哪来的?这个$stack, $pipe就是carryitem?

2年前 评论
柠檬K (楼主) 2年前
pndx

这么复杂的代码到底怎么写出来的。。。。

2年前 评论
柠檬K (楼主) 2年前
pndx

@柠檬K 讲一下这种写法的优点、作用吧

2年前 评论
柠檬K (楼主) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!