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 '请求处理中...' . "<br />";} 作为 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.

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值