laravel请求处理管道例子
例子:
<?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请求处理管道例子的更多相关文章
- php laravel请求处理管道(装饰者模式)
laravel的中间件使用了装饰者模式.比如,验证维护模式,cookie加密,开启会话等等.这些处理有些在响应前,有些在响应之后,使用装饰者模式动态减少或增加功能,使得框架可扩展性大大增强. 接下来简 ...
- Laravel 5.3 请求处理管道详解
对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做各种各样的判断,然后才允许后续处理. 我们通常的做法: Script 01.php Script 02.php 优点:直观,容易理解 缺 ...
- 学习ASP.NET Core,怎能不了解请求处理管道[1]: 中间件究竟是个什么东西?
ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 "通过重建Hosting系统理解HTTP请求在ASP.NET Core管道中的处理流 ...
- ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)
ASP.NET和ASP.NET MVC的HttpApplication请求处理管道有共同的部分和不同之处,本系列将体验ASP.NET MVC请求处理管道生命周期的19个关键环节. ①以IIS6.0为例 ...
- ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12)
在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6) ",体验了1-6关键环节,本篇继续. ⑦根据IsapiWorkerRequest对象,HttpRun ...
- ASP.NET MVC请求处理管道生命周期的19个关键环节(13-19)
在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12) ",体验了7-12关键环节,本篇继续. ⒀当请求到达UrlRoutingModule的时候,Url ...
- 学习ASP.NET Core, 怎能不了解请求处理管道[6]: 管道是如何随着WebHost的开启被构建出来的?
注册的服务器和中间件共同构成了ASP.NET Core用于处理请求的管道, 这样一个管道是在我们启动作为应用宿主的WebHost时构建出来的.要深刻了解这个管道是如何被构建出来的,我们就必须对WebH ...
- 学习ASP.NET Core, 怎能不了解请求处理管道[5]: 中间件注册可以除了可以使用Startup之外,还可以选择StartupFilter
中间件的注册除了可以借助Startup对象(DelegateStartup或者ConventionBasedStartup)来完成之外,也可以利用另一个叫做StartupFilter的对象来实现.所谓 ...
- PowerShell管道入门,看看你都会不(管道例子大全)
PowerShell的一个重中之重的功能就是管道(pipeline),本文从浅入深,一步一步详解管道的使用方法和例子,来看看有没有你所不知道的吧,如果全知道,恭喜你已经很厉害啦--适用于所有Power ...
随机推荐
- Flink开发-IDEA scala开发环境搭建
现在大数据相关服务,越来越倾向于使用scala语言,scala函数式编程的优势我不多赘述.最明显的一个优点,代码简洁.看个WordCount实现对比: Java版WordCount Execution ...
- leetcode-159周赛-5231-删除子文件夹
题目描述: 自己的提交: class Solution: def removeSubfolders(self, folder: List[str]) -> List[str]: d = {} r ...
- delphi 单元 MSHTML 之Ihtmldocument2
delphi : Ihtmldocument2接口的利用 MSHTML是微软公司的一个COM组件,该组件封装了HTML语言中的所有元素及其属性,穿越其供给的规范接口,能够访问指定网页的所有元素. MS ...
- 一句话下载总结(用于后渗透上传payload)
利用ftp来下载payload文件 echo open 192.168.1.1 21> ftp.txt echo ftp>> ftp.txt echo bin >> ft ...
- NX二次开发-NXOpen::WCS Class Reference
NX11+VS2013 #include <NXOpen/Part.hxx> #include <NXOpen/PartCollection.hxx> #include < ...
- Python 利用微信端口查看列车时刻表
import requests """ 该程序查看列车时刻 """ url0 = 'http://www.webxml.com.cn/Web ...
- error C2443: operand size conflict
#include <stdio.h> void main() { int a=98; __asm { mov al,a and al,11011111B mov a ...
- ionic:temple
ylbtech-ionic:temple 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返回顶部 作者:ylbtech出处:http://ylb ...
- 基于Netty的RPC架构学习笔记(六):netty5案例学习
文章目录 netty5服务端入门案例 netty5客户端入门案例 单客户端多连接程序 知识普及 线程池原理图 对象池原理图 对象组原理图 结论 理论结合实际 开干开干 总结 netty5服务端入门案例 ...
- CVE-2018-3246 weblogic xxe
使用P牛2018-2894的容器 http://192.168.245.130:7001/ws_utc/begin.do 导入测试用例 上传时抓取数据包 POST /ws_utc/resources/ ...