装饰器模式在Laravel中的应用学习笔记

内容来自 - 《Laravel框架关键技术解析》

装饰器模式在Laravel中的(请求中间件)的应用,简单例子

<?php

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

class StartSession implements Middleware
{
    public static function handle(Closure $next)
    {
        echo "开启session,获取数据" . PHP_EOL;
        $next();
        echo "保存数据,关闭session" . PHP_EOL;
    }
}

class EncryptCookies implements Middleware
{
    public static function handle(Closure $next)
    {
        echo "对输入请求的cookie进行解密" . PHP_EOL;
        $next();
        echo "对输出请求的cookie进行加密" . PHP_EOL;
    }
}

function getSlice()
{
    return function ($stack, $pipe) {
        return function () use ($stack, $pipe) {
            return $pipe::handle($stack);
        };
    };
}

function then()
{
    $pipes = [
        'EncryptCookies',
        'StartSession'
    ];

    $firstSlice = function () {
        echo "请求向路由器传递,返回响应" . PHP_EOL;
    };

    $pipes = array_reverse($pipes);//反转数组

    //$firstSlice作为第一个参数传递给getSlice处理,$pipes元素的第一个参数(StartSession)作为getSlice第二个参数传入处理
    //getSlice第一次执行返回的结果作为第二次调用getSlice的第一个参数,$pipes的第二个元素(EncryptCookies)作为getSlice第二个参数传入处理
    //以此类推
    call_user_func(
        array_reduce($pipes, getSlice(), $firstSlice)
    );

    //$a = function () {
    //            return StartSession::handle($firstSlice);
    //        }

    //$b = function () {
    //            return EncryptCookies::handle($a);
    //        }

    //$b()


}

then();