例子:

<?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. java.sql.Date和java.util.Date的联系和区别

    1) java.sql.Date是java.util.Date的子类,是一个包装了毫秒值的瘦包装器,允许 JDBC 将毫秒值标识为 SQL DATE 值.毫秒值表示自 1970 年 1 月 1 日 0 ...

  2. leetcood学习笔记-113-路径总和 II

    题目描述: 参考后的提交: class Solution(object): def pathSum(self, root, sum): """ :type root: T ...

  3. Android Studio Download

    { https://developer.android.google.cn/studio }

  4. Go 逻辑运算符

    Go 逻辑运算符 package main import "fmt" func main() { var a bool = true var b bool = false if ( ...

  5. 【Codeforces 1148B】Born This Way

    [链接] 我是链接,点我呀:) [题意] 有人要从A地飞向B地,然后从B地飞向C地. 给出A,B地的n.m个航班的出发时间. 已知从A到B的航班都是ta和tb时长到达B.C 只有到达B的时候航班还没起 ...

  6. NX二次开发-算法篇-创建最大边界包容盒

    NX9+VS2012 #include <uf.h> #include <uf_obj.h> #include <uf_modl.h> #include <u ...

  7. 秒懂机器学习---k临近算法(KNN)

    秒懂机器学习---k临近算法(KNN) 一.总结 一句话总结: 弄懂原理,然后要运行实例,然后多解决问题,然后想出优化,分析优缺点,才算真的懂 1.KNN(K-Nearest Neighbor)算法的 ...

  8. 李宏毅机器学习课程---3、Where does the error come from

    李宏毅机器学习课程---3.Where does the error come from 一.总结 一句话总结:机器学习的模型中error的来源是什么 bias:比如打靶,你的瞄准点离准心的偏移 va ...

  9. ftp和ssh登录缓慢的解决办法

    在垃圾邮件和短信盛行的今天,邮件和短信,拦截与反向域名解析的方式,有效的防止了垃圾短信.邮件的入侵.Vsfpd和sshd同样利用了反向域名解析这一功能(默认开启),.在客户端向server端请求访问时 ...

  10. 数据结构C++版-队列

    一.概念 分类: 二.补充说明 1.<面向对象的队列设计>课程问答: 首先要明确数据结构和数据存储结构的概念. 数据结构是指数据对象之间的逻辑关系,例如二叉树,队列,栈等,而数据存储结构是 ...