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 中间件实现原理的更多相关文章

  1. koa中间件系统原理及koa+orm2实践。

    koa是由 Express 原班人马打造的新的web框架.套用其官方的说法:Koa 应用是一个包含一系列中间件 generator 函数的对象. 这些中间件函数基于 request 请求以一个类似于栈 ...

  2. Express中间件的原理及实现

    在Node开发中免不了要使用框架,比如express.koa.koa2拿使用的最多的express来举例子开发中肯定会用到很多类似于下面的这种代码 var express = require('exp ...

  3. redux中间件的原理——从懵逼到恍然大悟

    前言react已经出来很久了,其生态圈之庞大,一锅炖不下!各种react-xx,已让我们不堪重负,github上随便一个demo,引入的模块至少都是五指之数+.看着头疼,嚼之无味…….在此建议新学者, ...

  4. redux中间件的原理

    前言react已经出来很久了,其生态圈之庞大,一锅炖不下!各种react-xx,已让我们不堪重负,github上随便一个demo,引入的模块至少都是五指之数+.看着头疼,嚼之无味…….在此建议新学者, ...

  5. asp.net core中间件工作原理

    不少刚学习.net core朋友对中间件的概念一直分不清楚,到底StartUp下的Configure方法是在做什么? public void Configure(IApplicationBuilder ...

  6. thinkphp5.1 中间件是什么,有什么用

    中间件是什么?有什么作用? 中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理.---tp5.1手册 也就是说,降低了系统的耦合:[在http请求阶段,执行中间件的入口执行方法(hand ...

  7. 浅谈redux 中间件的原理

    在使用redux管理异步数据流的时候,我们会使用中间件,以redux-thunk中间件为例,我们做一下分析: 首先是构建store,我们需要以下代码进行揉入中间件的类似creatStore函数的构造: ...

  8. Asp.net core中间件实现原理及用法解说

    简述asp.net core中间件的实现思路 原文地址:https://www.cnblogs.com/shengyu-kmust/p/11583974.html 一次http请求的过程,就是对一个R ...

  9. 难道这就是gin中间件的原理,一个装饰者模式而已?

    func wrapCtx(handler func(ctx *gin.Context)) gin.HandlerFunc { return func(c *gin.Context) { //获取请求的 ...

随机推荐

  1. Nginx1.6.0+MySQL5.6.19+PHP5.5.14(centos)

    一.配置防火墙,开启80端口.3306端口 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop fi ...

  2. httpClient连接工具类实测可用

    package com.jeecms.common.util; import com.google.gson.Gson; import com.jeecms.cms.api.Constants; im ...

  3. 为你的AliOS Things应用增加自定义cli命令

    摘要: 怎么才能在RTOS系统中,通过 串口shell控制LED的开关. 在日常嵌入式开发中,我们经常会用串口命令来使设备进入某种特定的状态,或执行某个特定的操作.如系统自检,模拟运行,或者进入手动模 ...

  4. Python爬虫之抓取豆瓣影评数据

    脚本功能: 1.访问豆瓣最受欢迎影评页面(http://movie.douban.com/review/best/?start=0),抓取所有影评数据中的标题.作者.影片以及影评信息 2.将抓取的信息 ...

  5. ceph-状态监测-脚本

    http://www.tang-lei.com/2018/06/05/ceph-%E7%8A%B6%E6%80%81%E7%9B%91%E6%B5%8B-%E8%84%9A%E6%9C%AC/ 为了能 ...

  6. 【Dart学习】--之Runes与Symbols相关方法总结

    一,Runes 在Dart中,Runes代表字符串的UTF-32字符集, 另一种Strings Unicode为每一个字符.标点符号.表情符号等都定义了 一个唯一的数值 由于Dart字符串是UTF-1 ...

  7. Chrome-谷歌页面翻译增强插件开发

    最近想做一个 Chrome 的插件(看别的博客说其实叫插件不准确,应该叫拓展,大家叫习惯了就按习惯的来吧).一开始咱先直接看了[Chrome 开发(360 翻译)](http://open.chrom ...

  8. Jmeter 5.1 从excel读取数据执行接口自动化

    思路:数据在excel文件中进行维护,然后转换成csv格式,jme中读取数据执行: 1.将接口各数据在excel文件中进行维护,然后存为csv格式,我的数据如下: 2.jmeter脚本,配置csv文件 ...

  9. 测开之路三十九:js基础

    js的两种使用方式 第一种使用方式:单独写js文件 在static下新建一个js文件并写入内容 alert('这是一个弹窗'); 在html文件里面,用script标签引入 <script sr ...

  10. Windows下使用Composer安装yii2

    Composer简介 Composer 是PHP中用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer会帮你安装这些依赖的 ...