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

  • 相关阅读:
    消息传递协议
    TSL 访问器
    graph engine
    uwp 动画Storyboard
    iOS播放视频时候,忽略设备静音按钮
    Could not find Developer Disk Image
    GIT常用命令
    iOS 音频播放时听筒及扬声器切换
    iOS 9:ATS
    iOS设计模式
  • 原文地址:https://www.cnblogs.com/buerr/p/6709895.html
Copyright © 2011-2022 走看看