Pipeline 管道

<?php

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

class VerifyCsrfToken implements Middleware 
{
    public static function handle(Closure $next)
    {       
        echo "验证Csrf-Token".'<br>';
        $next();
    }
}
class ShareErrorsFromSession implements Middleware 
{
    public static function handle(Closure $next)
    {
        echo "如果session中有'errors'变量, 则共享它".'<br>';
        $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 "添加下一次请求需要的cookie".'<br>';
    }
}
class EncryptCookies implements Middleware 
{
    public static function handle(Closure $next)
    {
        echo "对输入请求的cookie进行解密".'<br>';
        $next();
        echo "对输出响应的cookie进行加密".'<br>';
    }
}
class CheckForMaintenanceMode implements Middleware 
{
    public static function handle(Closure $next)
    {
        echo "确定当前程序是否处于维护状态".'<br>';
        $next();
    }
}

// $stack 即 $carry
function getSlice()
{
    return function($stack, $pipe)
    {
               // 输出 $carry 
               var_dump($stack());
        return function() use ($stack, $pipe)
        {
            return $pipe::handle($stack);
        };
    };
}
function then()
{
    $pipes = [
        "CheckForMaintenanceMode",                        
        "EncryptCookies",
        "AddQueuedCookiesToResponse",
        "StartSession",
        "ShareErrorsFromSession",
        "VerifyCsrfToken"];
        
    $firstSlice = function(){
        echo "<br>请求向路由器传递, 返回响应 <br><br>";
    };
    
    $pipes = array_reverse($pipes);
    call_user_func(
        array_reduce($pipes, getSlice(), $firstSlice)
    );
}

then();

第一次执行默认值 $firstSlice

carry
携带上次迭代里的值; 如果本次迭代是第一次,那么这个值是 initial。

item
携带了本次迭代的值。

initial
如果指定了可选参数 initial,该参数将在处理开始前使用,或者当处理结束,数组为空时的最后一个结果。

请求向路由器传递, 返回响应

D:\wamp\www\foo.php:61:null
验证Csrf-Token

请求向路由器传递, 返回响应

D:\wamp\www\foo.php:61:null
如果session中有'errors'变量, 则共享它
验证Csrf-Token

请求向路由器传递, 返回响应

D:\wamp\www\foo.php:61:null
开启session, 获取数据
如果session中有'errors'变量, 则共享它
验证Csrf-Token

请求向路由器传递, 返回响应

保存数据, 关闭session
D:\wamp\www\foo.php:61:null
开启session, 获取数据
如果session中有'errors'变量, 则共享它
验证Csrf-Token

请求向路由器传递, 返回响应

保存数据, 关闭session
添加下一次请求需要的cookie
D:\wamp\www\foo.php:61:null
对输入请求的cookie进行解密
开启session, 获取数据
如果session中有'errors'变量, 则共享它
验证Csrf-Token

请求向路由器传递, 返回响应

保存数据, 关闭session
添加下一次请求需要的cookie
对输出响应的cookie进行加密
D:\wamp\www\foo.php:61:null
确定当前程序是否处于维护状态
对输入请求的cookie进行解密
开启session, 获取数据
如果session中有'errors'变量, 则共享它
验证Csrf-Token

请求向路由器传递, 返回响应

保存数据, 关闭session
添加下一次请求需要的cookie
对输出响应的cookie进行加密

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容