thinkphp中间件和构造方法

中间件和构造方法 或者基类有什么不同呢

阅读 2k
1 个回答

当前类构造方法:单个类实例化时先执行自身的构造方法,如tp的前置操作。
基类:多个类实例化时,都需一定的初始化,那么就把通用的初始化过程放进基类中。
中间件:和实例化无关,多个对象按照顺序完成一件事,称为“管道”,每个中间件可以是类的一个方法也可以function(){}。如一杯泥沙的水,先通过过滤沙石的装置(对象),再通过过滤泥沙的装置(又一对象),再通过杀菌的装置(对象),再通过出水装置(对象)。即输出净水前,通过N个中间件。
简单阐述下原理:

$step1 = function ($next){
    echo "第一步:过滤小石头".PHP_EOL;
    $next();
};

$step2=function ($next){
    echo "第二步:过滤细沙".PHP_EOL;
    $next();
};

$step3 = function ($next){
    echo "第三步:过滤细菌".PHP_EOL;
    $next();
};

$sucess = function (){
    echo "最后:输出纯净水".PHP_EOL;
};


$callback = function ($next,$step) {
    return function () use ( $next, $step ) {
        return $step($next);
    };
};
$middleWares = [
    $step1,
    $step2,
    $step3
];

$middleWares=array_reverse($middleWares); //将数组元素顺序反转

call_user_func(
    array_reduce($middleWares,$callback,$sucess)
);
//第一步:过滤小石头 第二步:过滤细沙 第三步:过滤细菌 最后:输出纯净水

那么接下来演示框架中的中间件

interface MiddleWare{
    public static function handle(Closure $next);
}

class StartSession implements MiddleWare{
    public static function handle( Closure $next ) {
        echo '开启 session'.'<br>';
        $next();
        echo '关闭 session'.'<br>';
    }
}
class AddQueuedCookiesToResponse implements MiddleWare{
    public static function handle( Closure $next ) {
        $next();
        echo '添加下一次请求的token'."<br>";
    }
}
class EbcryptCookies implements MiddleWare{
    public static function handle( Closure $next ) {
        echo '对 cookie 加密'.'<br>';
        $next();
        echo '对 cookie 解密'.'<br>';
    }
}


function getSlice(){
    return function ($stack,$pipe){
        return function () use ($stack,$pipe){
            return $pipe::handle($stack);
        };
    };
}
function then() {
    $pipes = [
        'EbcryptCookies',               //加密请求cookie
        'AddQueuedCookiesToResponse',   //添加下一次请求需要的cookie
        'StartSession',                 //开启session
    ];

    $firstSlice=function(){echo '请求向路由器传递,返回相应'.'<br>';};

    $pipes=array_reverse($pipes);

    call_user_func(
        array_reduce($pipes,getSlice(),$firstSlice)
    );
}

then();
    /*
        对 cookie 加密
        开启 session
        请求向路由器传递,返回相应
        关闭 session
        添加下一次请求的token
        对 cookie 解密
    */
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题