欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Pipeline 管道

程序员文章站 2022-05-05 15:42:08
...
<?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进行加密

上一篇: sklearn pipeline

下一篇: pipeline tools