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. 《Spring Boot实战》笔记 (六章)

    6.1 基本配置 ........................................................................................... ...

  2. 【LeetCode】Recursion(共11题)

    链接:https://leetcode.com/tag/recursion/ 247 Strobogrammatic Number II (2019年2月22日,谷歌tag) 给了一个 n,给出长度为 ...

  3. boost propertyTree

    Boost PropertyTree provides a tree structure to store key/value pairs. Tree structures means that a ...

  4. 用闭包解决 js 循环中函数变量暂存问题

    需求:有一个数组,根据数组的值渲染对应的数字div,单击对应的div 在控制台打印对应的数字.如点击1,控制台打印1. 问题: 不管点击哪个值 打出来都是4 代码如下 <!DOCTYPE htm ...

  5. delphi 异形窗体可半透明

    unit xDrawForm; interface uses Windows, Messages, SysUtils, Classes, Controls, Forms, Menus, Graphic ...

  6. Microsoft SQL Server(sql server 关系型数据库管理系统)

    sql server一般指Microsoft SQL Server 关系型数据库管理系统 Microsoft SQL Server 是一个全面的数据库平台,使用集成的商业智能 (BI)工具提供了企业级 ...

  7. loadrunner(预测系统行为和性能的负载测试工具)

    LoadRunner,是一种预测系统行为和性能的负载测试工具.通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题,LoadRunner能够对整个企业架构进行测试.企业使用LoadRu ...

  8. 信息安全-威胁防御系统-Fortinet:Fortinet

    ylbtech-信息安全-威胁防御系统-Fortinet:Fortinet Fortinet 是多层威胁防御系统的创新者和先锋.该系统能够为业务通信提供最佳安全.优秀性能和低总体占用成本. Forti ...

  9. Linux用户空间与内核地址空间

    Linux 操作系统和驱动程序运行在内核空间,应用程序运行在用户空间,两者不能简单地使用指针传递数据,因为Linux使用的虚拟内存机制,用户空间的数据可能被换出,当内核空间使用用户空间指针时,对应的数 ...

  10. xcode安装pod

    参考了: https://blog.csdn.net/AugustDY/article/details/92078639 输入 ruby -v ,查看当前电脑的ruby版本,如果已经安装了ruby环境 ...