关于中间件中使用的管道机制

如果想在一个控制器方法中,添加前置和后置操作,可以借鉴

直接看代码

<?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
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值