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管道请求处理流程示意图:

  • 相关阅读:
    Python学习(3)——if语句
    Python学习(2)——编码
    一次性邮箱
    Python学习(1)
    Hello World
    java设计模式创建篇------原型模式
    Java技巧------Cloneable接口与clone方法
    java设计模式创建篇------抽象工厂
    java设计模式创建篇------工厂模式
    python函数式编程
  • 原文地址:https://www.cnblogs.com/buerr/p/6709895.html
Copyright © 2011-2022 走看看