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

  • 相关阅读:
    JAVA程序的运行机制
    DOS命令
    垃圾回收
    eureka的简单使用
    各微服务之间的调用
    各层调用关系与注解使用
    bean管理xml方式
    Lombok介绍和使用
    java特性 JDK JRE JVM
    git克隆 文件夹
  • 原文地址:https://www.cnblogs.com/buerr/p/6709895.html
Copyright © 2011-2022 走看看