Laravel管道(Pipeline)的解释
< 返回列表时间: 2020-06-27来源:OSCHINA
一、前言
在Laravel里面,管道这块的代码算是挺难理解的了,每个人有自己的理解方法,而我也有自己的理解,经过理解,我整理了一下,记录如下:
代码如下,参考 https://gitee.com/obamajs/php-pipeline <?php function Pipeline($stack, $pipe) { return function ($passable) use ($stack, $pipe) { if (is_callable($pipe)) { $pipe($passable, $stack); } elseif (is_object($pipe)) { $method = "handle"; if (!method_exists($pipe, $method)) { throw new InvalidArgumentException('object that own handle method'); } else { $pipe->$method($passable, $stack); } } else { throw new InvalidArgumentException('$pipe must be callback or object'); } }; } interface TestUnit { public function handle($passable, callable $next = null); } class Unit1 implements TestUnit { public function handle($passable, callable $next = null) { echo __CLASS__ . '->' . __METHOD__ . " called\n"; echo $passable . "\n"; $next($passable+1); } } class Unit2 implements TestUnit { public function handle($passable, callable $next = null) { echo __CLASS__ . '->' . __METHOD__ . " called\n"; echo $passable . "\n"; $next($passable+1); } } class InitialValue implements TestUnit { public function handle($passable, callable $next = null) { // 一般这里输出内容,所以不需要next了 echo __CLASS__ . '->' . __METHOD__ . " called\n"; //$next($passable); } } class Unit3 implements TestUnit { public function handle($passable, callable $next = null) { echo __CLASS__ . '->' . __METHOD__ . " called\n"; echo $passable . "\n"; $next($passable+1); } } $pipeline = array_reduce([new Unit1(), new Unit2(), new Unit3()], "Pipeline", function ($passable) { (new InitialValue())->handle($passable, null); echo $passable . "买买买\n"; }); $pipeline(1);

二、解释:
Pipeline 接受两个参数
$passable 是准备要从各级传送的值
第一次迭代:
return function ($passable) use (array_resuce最后那个函数, new Unit1())
第二次迭代
return function ($passable) use (第一次迭代的是一个参数为$passable的函数, new Unit2())
第三次迭代
return function ($passable) use (第二次迭代的是一个参数为$passable的函数, new Unit3())
三、执行过程
1. 执行第三次迭代(1)
2. 执行逻辑 new Unit3()->handle($passable, $next); 而handle函数里面有 $next($passable); 也就是
- 第二次迭代($passable) use (第一次迭代的是一个参数为$passable的函数, new Unit2())
3. 执行逻辑 new Unit2()->handle($passable, $next); 而handle函数里面有 $next($passable); 也就是
- 第一次迭代($passable) use (array_resuce最后那个函数, new Unit1())
4. 执行逻辑 new Unit1()->handle($passable, $next); 而handle函数里面有 $next($passable); 也就是
- array_resuce最后那个函数($passable)
5. 到这里,所有流程就执行完了
热门排行