我们来看一下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
这里是实现的位置:vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php
当闭包开始嵌套,地狱也在逐渐形成. –鲁迅
这个太绕了):
答案是
hi21
嘿嘿嘿当闭包开始嵌套,地狱也在逐渐形成 :joy:
当闭包开始嵌套,地狱也在逐渐形成 :sweat_smile:
还好,为了能串起来不同的 package 我们已经基本适应管道开发了,laravel 的中间件就是管道实现的。
卷起来了
日了狗了。。。。。。
人麻了
如果只需要简单的管道,直接 foreach 也就可以了。
Laravel 这种套闭包的方式的可以用来做 前置、后置处理。
一、$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'
三、总结:这是闭包嵌套的问题
@柠檬K
还有就是
carry()
里面$stack, $pipe
哪来的?这个$stack, $pipe
就是carry
和item
?这么复杂的代码到底怎么写出来的。。。。
@柠檬K 讲一下这种写法的优点、作用吧