直接上浓缩版的代码
<?php
interface Step
{
public static function go(Closure $next);
}
/**
*
*/
class FirstStep implements Step
{
public static function go(Closure $next)
{
echo "开启session,获取数据<br>";
$next();
echo "保存数据,关闭session<br>";
}
}
class SecondStep implements Step
{
public static function go(Closure $next)
{
echo "csrf-token<br>";
$next();
}
}
function goFun($step, $className)
{
return function() use ($step, $className)
{
return $className::go($step);
};
}
function then()
{
$steps = ['FirstStep', 'SecondStep'];
$steps = array_reverse($steps);
$initial = function() {
echo "请求向路由器传递,返回响应<br>";
};
$go = array_reduce($steps, "goFun", $initial);
$go();
}
then();
输出:
开启session,获取数据
csrf-token
请求向路由器传递,返回响应
保存数据,关闭session
所以整个请求处理路线的完成顺序,主要是由$steps的数组顺序来决定的。
由于array_reduce都是把上一个单元作为参数传入,所以总体执行顺序呈现出一种与$steps数组顺序完全相反的状态。这点比较纠结。。。
最后补充一张laravel管道请求处理流程示意图: