ThinkPHP5.1x 中间件实现原理
ThinkPHP5.1x的中间件,其核心还是闭包函数的应用,来实现“责任链”模式:

模拟代码:

<?php //模拟的控制器
class Controller {
public function index($request) {
echo '控制器方法体',$request,'<br>';
}
} //中间件
class Before1 {
public function handle($request, Closure $next) {
echo 'before1<br>'; //业务逻辑,注意前置与后置中间件业务逻辑代码的位置
return $next($request);
} }
//中间件
class Before2 {
public function handle($request, Closure $next) {
echo 'before2<br>';
return $next($request);
}
}
//中间件
class After1 {
public function handle($request, Closure $next) {
$response = $next($request);
echo 'after1<br>'; //业务逻辑,注意前置与后置中间件业务逻辑代码的位置
return $response;
}
}
//中间件
class After2 {
public function handle($request, Closure $next) {
$response = $next($request);
echo 'after2<br>';
return $response;
}
} class Middleware { public static $queue; //中间件队列
public static function init() {
//模拟的中间件,数量任意添加
self::$queue[] = [[After1::class, 'handle'], null];
self::$queue[] = [[After2::class, 'handle'], null];
self::$queue[] = [[Before1::class, 'handle'], null];
self::$queue[] = [[Before2::class, 'handle'], null];
//模拟的控制器
self::$queue[] = [[Controller::class, 'index'], null];
} //调用中间件
public static function dispatch($request) {
call_user_func(self::resolve(), $request);
} //返回闭包函数
public static function resolve(){
return function($request){
$middleware = array_shift(self::$queue);
if ($middleware != null) {
list($call, $param) = $middleware;
call_user_func_array($call, [$request, self::resolve()]); //执行中间件
}
};
}
} $request = "模拟的request对象";
Middleware::init();
Middleware::dispatch($request);
ThinkPHP5.1x 中间件实现原理的更多相关文章
- koa中间件系统原理及koa+orm2实践。
koa是由 Express 原班人马打造的新的web框架.套用其官方的说法:Koa 应用是一个包含一系列中间件 generator 函数的对象. 这些中间件函数基于 request 请求以一个类似于栈 ...
- Express中间件的原理及实现
在Node开发中免不了要使用框架,比如express.koa.koa2拿使用的最多的express来举例子开发中肯定会用到很多类似于下面的这种代码 var express = require('exp ...
- redux中间件的原理——从懵逼到恍然大悟
前言react已经出来很久了,其生态圈之庞大,一锅炖不下!各种react-xx,已让我们不堪重负,github上随便一个demo,引入的模块至少都是五指之数+.看着头疼,嚼之无味…….在此建议新学者, ...
- redux中间件的原理
前言react已经出来很久了,其生态圈之庞大,一锅炖不下!各种react-xx,已让我们不堪重负,github上随便一个demo,引入的模块至少都是五指之数+.看着头疼,嚼之无味…….在此建议新学者, ...
- asp.net core中间件工作原理
不少刚学习.net core朋友对中间件的概念一直分不清楚,到底StartUp下的Configure方法是在做什么? public void Configure(IApplicationBuilder ...
- thinkphp5.1 中间件是什么,有什么用
中间件是什么?有什么作用? 中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理.---tp5.1手册 也就是说,降低了系统的耦合:[在http请求阶段,执行中间件的入口执行方法(hand ...
- 浅谈redux 中间件的原理
在使用redux管理异步数据流的时候,我们会使用中间件,以redux-thunk中间件为例,我们做一下分析: 首先是构建store,我们需要以下代码进行揉入中间件的类似creatStore函数的构造: ...
- Asp.net core中间件实现原理及用法解说
简述asp.net core中间件的实现思路 原文地址:https://www.cnblogs.com/shengyu-kmust/p/11583974.html 一次http请求的过程,就是对一个R ...
- 难道这就是gin中间件的原理,一个装饰者模式而已?
func wrapCtx(handler func(ctx *gin.Context)) gin.HandlerFunc { return func(c *gin.Context) { //获取请求的 ...
随机推荐
- java插件提示安全设定高,不能加载解决方法
当不可信小应用程序或应用程序在 Web 浏览器中运行时,我应当如何控制? 本文适用于: Java 版本: 7.0, 8.0 通过 Java 控制面板设置安全级别 在 Java 控制面板中,单击 Sec ...
- springboot全局字符编码设置
1.在application.properties中设置 #编码格式 spring.http.encoding.force=true spring.http.encoding.charset=UTF- ...
- django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11
搭建Django2.0+Python3+MySQL5时同步数据库时报错:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 o ...
- nyoj 83:迷宫寻宝(二)(计算几何)
题目链接 枚举所有墙的2n个端点与宝物的位置作为一条线段(墙的端点必定与边界重合), 求出与之相交的最少线段数(判断线段相交时用跨立实验的方法),+1即为结果. #include<bits/st ...
- poj 3468: A Simple Problem with Integers (树状数组区间更新)
题目链接: http://poj.org/problem?id=3468 题目是对一个数组,支持两种操作 操作C:对下标从a到b的每个元素,值增加c: 操作Q:对求下标从a到b的元素值之和. 这道题也 ...
- python之字符串切分
在工作中,经常遇到字符串切分,尤其是操作linux命令,返回一段文本,如下面这种格式 Filesystem Size Used Avail Use% Mounted on /dev/vda1 40G ...
- npm和gem
https://blog.csdn.net/u011099640/article/details/53083845
- 使用PowerShell下载必应图片
今天想聊聊POWERSHELL对于WEB页面的一些应用,本人也是最近才发觉其实PS也是可以做爬虫的...所以想抛砖引玉给大家一个思路. 这次要用到的主要命令是 invoke-webrequest 先来 ...
- HDU 6069 Counting Divisors —— 2017 Multi-University Training 4
Counting Divisors Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Oth ...
- BottomNavigationBar 自定义 底部导航条
在flutter中,BottomNavigationBar 是底部导航条,可以让我们定义底部 Tab 切换,bottomNavigationBar是 Scaffold 组件的参数. BottomNav ...