例子:

<?php

interface Middleware{

  public static function handle (Closure $next);
}

class VerifyCsrfToken implements Middleware{

  public static function handle(Closure $next){

  echo "验证Csrf-Token"."<br/>";
  $next();
}
}
class ShareErrorsFromSession implements Middleware{

  public static function handle(Closure $next){

    echo "如果Session中有'errors'变量,则共享它"."<br/>";
    $next();
  }
}
class StartSession implements Middleware{

  public static function handle(Closure $next){

    echo "开启session,获取数据"."<br/>";
    $next();
    echo "保存数据,关闭session"."<br/>";
  }
}
class AddQueuedCookiesToResponse implements Middleware{

  public static function handle(Closure $next){

    $next();
    echo "添加下一次请求需要的cookie"."<br/>";
  }
}
class EncryptCookies implements Middleware{

  public static function handle(Closure $next){

    echo "对输入的cookies进行解密"."<br/>";
    $next();
    echo "对输出响应的cookie进行加密"."<br/>";
  }
}
class CheckForMaintenanceMode implements Middleware{

  public static function handle(Closure $next){
    echo "确定当前程序是否处于维护状态"."<br/>";
    $next();
  }
}

/*

*函数getSlice()中的"()"需要留意。

*使用"function getSlice())"时,在array_reduce()中需要用“array($a,getSlice(),$b)”。

*使用"function getSlice"时,在array_reduce()中需要用“array($a,"getSlice",$b)”。

*具体情况可以参考《Laravel框架关键技术解析---高清版.pdf》中“请求处理管道”一章

*/

function getSlice(){
  return function($stack,$pipe){

    return function() use ($stack,$pipe){

      return $pipe::handle($stack);
    };
  };
}

function then(){

  $pipes = [
    "CheckForMaintenanceMode",
    "EncryptCookies",
    "AddQueuedCookiesToResponse",
    "StartSession",
    "ShareErrorsFromSession",
    "VerifyCsrfToken"
  ];
  $firstSlice = function(){
    echo "请求向路由传递,返回响应"."<br/>";
  };
  $pipes = array_reverse($pipes); //把数组里的顺序颠倒一下,头变尾,尾变头
  call_user_func(
    array_reduce($pipes, getSlice(),$firstSlice)  //把$pipes传入getSlice()里的$pipe,$firstSlice传入getSlice()里的$stack。且$firstSlice只传一次,$pipes数组每次传一个值,从尾部开始传,直到传完所有制为止。
  );
}

then();

输出结果:

确定当前程序是否处于维护状态
对输入的cookies进行解密
开启session,获取数据
如果Session中有'errors'变量,则共享它
验证Csrf-Token
请求向路由传递,返回响应
保存数据,关闭session
添加下一次请求需要的cookie
对输出响应的cookie进行加密

laravel请求处理管道例子的更多相关文章

  1. php laravel请求处理管道(装饰者模式)

    laravel的中间件使用了装饰者模式.比如,验证维护模式,cookie加密,开启会话等等.这些处理有些在响应前,有些在响应之后,使用装饰者模式动态减少或增加功能,使得框架可扩展性大大增强. 接下来简 ...

  2. Laravel 5.3 请求处理管道详解

    对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做各种各样的判断,然后才允许后续处理. 我们通常的做法: Script 01.php Script 02.php 优点:直观,容易理解 缺 ...

  3. 学习ASP.NET Core,怎能不了解请求处理管道[1]: 中间件究竟是个什么东西?

    ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 "通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流 ...

  4. ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)

    ASP.NET和ASP.NET MVC的HttpApplication请求处理管道有共同的部分和不同之处,本系列将体验ASP.NET MVC请求处理管道生命周期的19个关键环节. ①以IIS6.0为例 ...

  5. ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12)

    在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6) ",体验了1-6关键环节,本篇继续. ⑦根据IsapiWorkerRequest对象,HttpRun ...

  6. ASP.NET MVC请求处理管道生命周期的19个关键环节(13-19)

    在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12) ",体验了7-12关键环节,本篇继续. ⒀当请求到达UrlRoutingModule的时候,Url ...

  7. 学习ASP.NET Core, 怎能不了解请求处理管道[6]: 管道是如何随着WebHost的开启被构建出来的?

    注册的服务器和中间件共同构成了ASP.NET Core用于处理请求的管道, 这样一个管道是在我们启动作为应用宿主的WebHost时构建出来的.要深刻了解这个管道是如何被构建出来的,我们就必须对WebH ...

  8. 学习ASP.NET Core, 怎能不了解请求处理管道[5]: 中间件注册可以除了可以使用Startup之外,还可以选择StartupFilter

    中间件的注册除了可以借助Startup对象(DelegateStartup或者ConventionBasedStartup)来完成之外,也可以利用另一个叫做StartupFilter的对象来实现.所谓 ...

  9. PowerShell管道入门,看看你都会不(管道例子大全)

    PowerShell的一个重中之重的功能就是管道(pipeline),本文从浅入深,一步一步详解管道的使用方法和例子,来看看有没有你所不知道的吧,如果全知道,恭喜你已经很厉害啦--适用于所有Power ...

随机推荐

  1. PHP算法之有效的括号

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空字符串可被认为是 ...

  2. leetcode-159周赛-5231-删除子文件夹

    题目描述: 自己的提交: class Solution: def removeSubfolders(self, folder: List[str]) -> List[str]: d = {} r ...

  3. CSP-S2019旅游记

    CSP-S2019 你问我为什么写旅游记? 因为好像除了旅游我今年啥都没干 Day0 校内模拟一直被吊锤,考前几场几乎要爆零 这提莫就不是什么好兆头 在家二刷水淹东京完回学校,带了一大堆家当上车 去广 ...

  4. thinkphp 性能调试

    开发过程中,有些时候为了测试性能,经常需要调试某段代码的运行时间或者内存占用开销,系统提供了G方法可以很方便的获取某个区间的运行时间和内存占用情况. 例如: 富瑞联华大理石平台大理石平台检定规程 G( ...

  5. 「题解」:x

    问题 A: x 时间限制: 1 Sec  内存限制: 256 MB 题面 题面谢绝公开. 题解 赛时想到了正解并且对拍了很久.对拍没挂,但是评测姬表示我w0了……一脸懵逼. 不难证明,如果对于两个数字 ...

  6. [学习笔记] $FWT$

    \(FWT\)--快速沃尔什变化学习笔记 知识点 \(FWT\)就是求两个多项式的位运算卷积.类比\(FFT\),\(FFT\)大多数求的卷积形式为\(c_n=\sum\limits_{i+j=n}a ...

  7. 牛客多校第九场 D Knapsack Cryptosystem 背包

    题意: 给你32个物品,给定一个容积,让你恰好把这个背包装满,求出装满的方案 题解: 暴力计算的话,复杂度$2^{32}$肯定会炸,考虑一种类似bsgs的算法,先用$2^{16}$的时间遍历前一半物品 ...

  8. Python入门 mac系统/linux系统 安装python (一)

    mac 系统 在命令行里,不会用命令行就别学编程了,自行查一下怎么用吧 brew install python 如果没有brew这个命令: 在mac终端下执行 /usr/bin/ruby -e &qu ...

  9. 基于Netty的RPC架构学习笔记(九):自定义序列化协议

    文章目录 为什么需要自定义序列化协议

  10. 20140329 自由 youtube

    1.人生入戏,全靠演技:人生苦短,必须性感 2.youtube修改用户名 3.使用代理软件修改了IE的代理导致上不了网