例子:

<?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. 脚本启动SpringBoot(jar)

    #!/bin/sh RESOURCE_NAME=springbsit-api.jar tpid=`ps -ef|grep $RESOURCE_NAME|grep -v grep|grep -v kil ...

  2. c++ GetAsyncState() 函数

    函数原型 SHORT GetAsyncKeyState(int vKey); 例:若判断 回车键 if(GetAsyncKeyState(VK_RETURN)&0x8000) ( return ...

  3. c++ 枚举简单举例

    #include <iostream> enum Enumeration{ VAL1, VAL2, VAL3=100, VAL4 }; int main() { using namespa ...

  4. HDFS API 操作实例(一) HDFS读写操作

    1. 读取HDFS文件 1.1 字符读取HDFS上的文件 Configuration conf = new Configuration(); Path path = new Path(pathstr) ...

  5. ps制作浮雕和投影效果

    1用文字横排工具写个hope,按住ctrl+t可以调试出文字工具,上面直接用500点来改变文字的大小.2 用矩形选框工具直接可以切割图片的大小,然后双击一个图层,添加样式为浮雕....然后合并图层3 ...

  6. canvas前端压缩图片和视频首屏缩略图并上传到服务器

    图片: var img = document.createElement('img') img.src = window.URL.createObjectURL(fileObj.file) // 加载 ...

  7. Zookeeper怎么实现分布式锁?

    对访问资源 R1 的过程加锁,在操作 O1 结束对资源 R1 访问前,其他操作不允许访问资源 R1.以上算是对独占锁的简单定义了,那么这段定义在 Zookeeper 的"类 Unix/Lin ...

  8. Python-docx库的使用

    from docx import Document from docx.shared import Inches document = Document() document.add_heading( ...

  9. jQuery post使用变量作参数名

    jQuery Query Post使用方法: $.post("test.php", { name: "John", time: "2pm" ...

  10. Neo4j使用简单例子

    Neo4j Versions Most of the examples on this page are written with Neo4j 2.0 in mind, so they skip th ...