zoukankan      html  css  js  c++  java
  • 简单实现laravel中的装饰者模式

    直接上浓缩版的代码

    <?php
    interface Step
    {
      public static function go(Closure $next);
    }

    /**
    *
    */
    class FirstStep implements Step
    {
      public static function go(Closure $next)
      {
        echo "开启session,获取数据<br>";
        $next();
        echo "保存数据,关闭session<br>";
      }
    }

    class SecondStep implements Step
    {
      public static function go(Closure $next)
      {
        echo "csrf-token<br>";
        $next();
      }
    }

    function goFun($step, $className)
    {
      return function() use ($step, $className)
      {
        return $className::go($step);
      };
    }

    function then()
    {
      $steps = ['FirstStep', 'SecondStep'];
      $steps = array_reverse($steps);
      $initial = function() {
        echo "请求向路由器传递,返回响应<br>";
      };
      $go = array_reduce($steps, "goFun", $initial);
      $go();
    }

    then();

    输出:

    开启session,获取数据
    csrf-token
    请求向路由器传递,返回响应
    保存数据,关闭session

    所以整个请求处理路线的完成顺序,主要是由$steps的数组顺序来决定的。

    由于array_reduce都是把上一个单元作为参数传入,所以总体执行顺序呈现出一种与$steps数组顺序完全相反的状态。这点比较纠结。。。

    最后补充一张laravel管道请求处理流程示意图:

  • 相关阅读:
    广域网(ppp协议、HDLC协议)
    0120. Triangle (M)
    0589. N-ary Tree Preorder Traversal (E)
    0377. Combination Sum IV (M)
    1074. Number of Submatrices That Sum to Target (H)
    1209. Remove All Adjacent Duplicates in String II (M)
    0509. Fibonacci Number (E)
    0086. Partition List (M)
    0667. Beautiful Arrangement II (M)
    1302. Deepest Leaves Sum (M)
  • 原文地址:https://www.cnblogs.com/buerr/p/6709895.html
Copyright © 2011-2022 走看看