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

  • 相关阅读:
    连接数据库及出现System.AccessViolationException错误的解决方法
    WCF REST 工作总结
    jquery easyui 扩展验证
    正则表达式语法
    SQL select语句执行顺序
    添加头文件afxwin.h后引起异常的解决办法
    imagej基本操作
    医学图像处理(一)
    灰度图像的自动阈值分割(Otsu 法)
    关于glog使用中遇到的问题
  • 原文地址:https://www.cnblogs.com/buerr/p/6709895.html
Copyright © 2011-2022 走看看