laravel 中间件 管道
管道模式 是将复杂的处理流程分解成多个独立的子任务
Laravel中的管道体现在中间件中,主要是通过 array_reduce这个函数来实现的
<?php
$arr = [1,2,3];
$r = array_reduce($arr,'sum');
function sum($carry,$pipe){
$carry += $pipe;
return $carry;
}
var_dump($r) //输出6
array_reduce() 这个函数可以 回调函数循环的作用到每个元素中,从而将数组简化成单一的值
demo:
<?php
interface RequestInterface
{
public static function handel(Closure $next);
}
class Request1 implements RequestInterface
{
public static function handel(Closure $next){
echo "Request1 Begin." . "<br />";
$next();
echo "Request1 End." . "<br />";
}
}
class Request2 implements RequestInterface
{
public static function handel(Closure $next){
echo "Request2 Begin." . "<br />";
$next();
echo "Request2 End." . "<br />";
}
}
class Request3 implements RequestInterface
{
public static function handel(Closure $next){
echo "Request3 Begin." . "<br />";
$next();
echo "Request3 End." . "<br />";
}
}
class Request4 implements RequestInterface
{
public static function handel(Closure $next){
echo "Request4 Begin." . "<br />";
$next();
echo "Request4 End." . "<br />";
}
}
class Client
{
private $pipes = [
'Request1',
'Request2',
'Request3',
'Request4',
];
private function defaultClosure()
{
return function(){
echo '请求处理中...' . "<br />";
};
}
//整个请求处理管道的关键
private function getSlice(){
return function($stack,$pipe){
return function()use($stack,$pipe){
return $pipe::handel($stack);
};
};
}
//负责发起请求处理
public function then(){
call_user_func(array_reduce($this->pipes, $this->getSlice(),$this->defaultClosure()));
}
}
$worker = new Client();
$worker->then();
第一次运行:
$stack = $this->defaultClosure() 是一个回调函数 function(){ echo ‘请求处理中…’ . “
“;} 作为 getSlice() 第一个参数 假设为s1
最终返回的是一个回调函数
function(s1,’Request1’){
return function()use(s1,'Request1')\{
return Request1::handel(s1);
}
}
假设该匿名函数为s2
第二次运行:
得到回调函数
function(s2,’Request2’){
return function()use(s2,'Request2')\{
return Request2::handel(s2);
}
}
假设该回调函数为s3
第三次运行
得到回调函数
function(s3,’Request3’){
return function()use(s3,'Request3')\{
return Request3::handel(s3);
}
}
假设该回调函数为s4
第四次运行
得到回调函数
function(s4,’Request4’){
return function()use(s4,'Request4')\{
return Request4::handel(s4);
}
}
假设为s5
array_reduce() 返回一个回调函数 s5 然后 call_user_func(s5) 执行这个回调函数
先运行Request4::handel(s4) 输出Request4 Begin 再运行 $next() 也就是 执行s4()
Request3::handel(s3) 输出Request3Begin 再运行$next() 也就是执行s3()
Request2::handel(s2) 输出Request2Begin 再运行$next() 也就是执行s2()
Request1::handel(s1) 输出Request1Begin 再运行$next() 也就是执行s1()
$this->defaultClosure() 输出请求处理中…
接着继续输出
Request1 End.
Request2 End.
Request3 End.
Request4 End.
关系像这样
function (){
return Request4::handle(function (){
return Request3::handle(function (){
return Request2::handle(function (){
return Reuqest1::handle(function (){
echo '请求处理中...' . "<br />";
});
});
});
});
}
执行上面代码后 返回
Request4 Begin.
Request3 Begin.
Request2 Begin.
Request1 Begin.
请求处理中…
Request1 End.
Request2 End.
Request3 End.
Request4 End.
还没有评论,来说两句吧...