如果想在一个控制器方法中,添加前置和后置操作,可以借鉴
直接看代码
<?php
class a{
public static function hander(Closure $fun){
echo "前置 ----- a\n";
$fun();
echo "后置 ----- a\n";
}
}
class b{
public static function hander(Closure $fun){
echo "前置 ----- b\n";
$fun();
echo "后置 ----- b\n";
}
}
class Controller{
public function index(){
return "这个是控制器方法\n";
}
}
class pipeline{
private $pipes = [
'a',
'b',
];
public function getSlice(){
return function ($stack,$pipe){
return function() use ($stack,$pipe){
$pipe::hander($stack);
};
};
}
/**
* 一共执行了两遍getSlice()函数返回的闭包,这是一个递归调用
* 第一遍:
* $stack = function(){echo (new Controller)->index()}
* $pipe = 'a';
* 但是这个时候,并没有执行getSlice函数返回的闭包中的闭包
* 第二遍:
* $stack = 第一遍执行时,getSlice()函数中的闭包返回的闭包
* $pipe = 'b';
* 现在,才开始执行getSlice()函数中的闭包返回的闭包
* 'b'::hander($stack);
* 前置-----b
* $stack()
* $a::hander($stack)
* 前置-----a
* $stack()
* (new Controller)->index()
* return "这个是控制器方法\n";
* 后置-----a
* 后置-----b
*/
public function then(){
$res = array_reduce($this->pipes,$this->getSlice(),$this->getClass());
$res();
}
private function getClass(){
return function(){
echo (new Controller)->index();
};
}
}
$p = new pipeline();
$p->then();
/*
* 前置 ----- b
* 前置 ----- a
* 这个是控制器方法
* 后置 ----- a
* 后置 ----- b
*/