<?php

class MiddlewareStack
{
private $middlewares = [];
private $request;
private $response; /**
* 添加中间件到堆栈
*
* @param callable $middleware 中间件函数,接受请求、响应和下一个中间件作为参数
*/
public function add(callable $middleware)
{
$this->middlewares[] = $middleware;
} /**
* 设置请求和响应处理函数
*
* @param callable $request 请求处理函数,无参数,返回一个请求对象或数据
* @param callable $response 响应处理函数,接受请求处理结果作为参数,返回最终响应
*/
public function setHandlers(callable $request, callable $response)
{
$this->request = $request;
$this->response = $response;
} /**
* 处理请求,通过中间件堆栈
*
* @return mixed 响应结果
*/
public function handle()
{
$next = function ($requestData) use (&$next) {
// 如果没有更多的中间件,调用最终的响应处理函数
if (empty($this->middlewares)) {
return call_user_func($this->response, $requestData);
} // 取出下一个中间件并调用
$middleware = array_shift($this->middlewares);
return $middleware($requestData, $this->response, $next);
}; // 从第一个中间件开始处理
$requestData = call_user_func($this->request);
return $next($requestData);
}
} // 示例中间件:身份验证
function authMiddleware($requestData, $response, $next) {
// 模拟身份验证检查
if (!isset($requestData['user'])) {
return "Unauthorized"; // 或者返回一个适当的 HTTP 响应
}
return $next($requestData);
} // 示例中间件:日志记录
function loggingMiddleware($requestData, $response, $next) {
$startTime = microtime(true);
$responseData = $next($requestData);
$endTime = microtime(true);
// 这里可以记录日志,例如使用 monolog 或其他日志库
echo "Request took " . ($endTime - $startTime) . " seconds\n";
return $responseData;
} // 示例请求处理函数
function requestFunction() {
// 模拟一个请求,例如从 $_GET, $_POST, 或其他来源获取数据
return [
'user' => 'john_doe', // 模拟已验证的用户
// 其他请求数据...
];
} // 示例响应处理函数
function responseFunction($requestData) {
// 处理请求数据并生成响应
return "Hello, " . $requestData['user'] . "!";
} // 使用中间件
$middlewareStack = new MiddlewareStack();
$middlewareStack->add(authMiddleware);
$middlewareStack->add(loggingMiddleware);
$middlewareStack->setHandlers(requestFunction, responseFunction); // 处理请求
$response = $middlewareStack->handle();
echo $response;

稍微改造一下:

<?php

class MiddlewareStack
{
private $middlewares = [];
private $request;
private $response; /**
* 添加中间件到堆栈
*
* @param callable $middleware 中间件函数,接受请求、响应和下一个中间件作为参数
*/
public function add(callable $middleware)
{
$this->middlewares[] = $middleware;
} /**
* 设置请求和响应处理函数
*
* @param callable $request 请求处理函数,无参数,返回一个请求对象或数据
* @param callable $response 响应处理函数,接受请求处理结果作为参数,返回最终响应
*/
public function setHandlers(callable $request, callable $response)
{
$this->request = $request;
$this->response = $response;
} /**
* 处理请求,通过中间件堆栈
*
* @return mixed 响应结果
*/
public function handle()
{
$next = function ($requestData) use (&$next) {
// 如果没有更多的中间件,调用最终的响应处理函数
if (empty($this->middlewares)) {
return call_user_func($this->response, $requestData);
} // 取出下一个中间件并调用
$middleware = array_shift($this->middlewares);
return $middleware($requestData, $this->response, $next);
}; // 从第一个中间件开始处理
$requestData = call_user_func($this->request);
return $next($requestData);
}
} // 示例中间件:身份验证
class authMiddleware{
public static function is() {
return function($requestData, $response, $next){
// 模拟身份验证检查
if (!isset($requestData['user'])) {
return "Unauthorized"; // 或者返回一个适当的 HTTP 响应
}
return $next($requestData);
};
}
} // 示例中间件:身份验证
function authMiddleware1($requestData, $response, $next) {
// 模拟身份验证检查
if (!isset($requestData['user'])) {
return "Unauthorized"; // 或者返回一个适当的 HTTP 响应
}
return $next($requestData);
} // 示例中间件:日志记录
function loggingMiddleware($requestData, $response, $next) {
$startTime = microtime(true);
$responseData = $next($requestData);
$endTime = microtime(true);
// 这里可以记录日志,例如使用 monolog 或其他日志库
echo "Request took " . ($endTime - $startTime) . " seconds\n";
return $responseData;
} // 示例请求处理函数
function requestFunction() {
// 模拟一个请求,例如从 $_GET, $_POST, 或其他来源获取数据
return [
'user' => 'john_doe', // 模拟已验证的用户
// 其他请求数据...
];
} // 示例响应处理函数
function responseFunction($requestData) {
// 处理请求数据并生成响应
return "Hello, " . $requestData['user'] . "!";
} // 使用中间件
$middlewareStack = new MiddlewareStack();
$middlewareStack->add(authMiddleware::is());
$middlewareStack->add(loggingMiddleware);
$middlewareStack->setHandlers(requestFunction, responseFunction); // 处理请求
$response = $middlewareStack->handle();
echo $response;

AI回答:一个简洁的php中间件类的更多相关文章

  1. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  2. classmethod一个用处是创建可选类构造器

    Definition and Introduction通常来说, descriptor 是一种绑定着特殊行为属性的对象, 在访问它时行为被descriptor协议定义的方法所重载.这些方法是__get ...

  3. 用UseMiddleware扩展方法注册中间件类

    用UseMiddleware扩展方法注册中间件类 .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件 ...

  4. 如何一秒钟从头构建一个 ASP.NET Core 中间件

    前言 其实地上本没有路,走的人多了,也便成了路. -- 鲁迅 就像上面鲁迅说的那样,其实在我们开发中间件的过程中,微软并没有制定一些策略或者文档来约束你如何编写一个中间件程序, 但是其中却存在者一些最 ...

  5. DevOps运动的缘起 将DevOps想象为一种编程语言里面的一个接口,而SRE类实现了这个接口

     SRE vs DevOps:是敌是友? - DockOne.io http://www.dockone.io/article/5935   RE vs DevOps:是敌是友? [编者的话]网站可靠 ...

  6. 3.实现一个名为Person的类和它的子类Employee,Employee有两个子类Faculty 和Staff。

    23.实现一个名为Person的类和它的子类Employee,Employee有两个子类Faculty 和Staff. 具体要求如下: (1)Person类中的属性有:姓名name(String类型) ...

  7. 一天一个Java基础——对象和类

    1.在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象 2.可以在类中设置两种类型的元素:字段(也被称作数据成员)和方法(也被称作成员函数) 3.字段可以是任何类型的对象 ...

  8. 一个简洁的PHP可逆加密函数(分享)

    http://www.jb51.net/article/38018.htm 本篇文章是对一个简洁的PHP可逆加密函数进行了详细的分析介绍,需要的朋友参考下   很多时候我们需要对数据进行加密解密,比如 ...

  9. 一个简洁的小H车调运模型

    一个简洁的小H车调运模型 不久前, 帝都B城市到处都是小H车, 理想的小H车应该是布朗运动\均匀分布,可是现实上它们就是不均匀.于是有如下问题: 观察帝都 HD区SY村区域,将其划分成10个用车点,用 ...

  10. 一个漂亮的php验证码类

    一个漂亮的php验证码类(分享)   作者: 字体:[增加 减小] 类型:转载 下面小编就为大家分享一个漂亮的php验证码类.需要的朋友可以过来参考下   直接上代码: 复制代码 代码如下: //验证 ...

随机推荐

  1. 尝试新的 System.Text.Json 源生成器

    尝试新的 System.Text.Json 源生成器 在 .NET 6.0 的预览版中,我们使用 System.Text.Json 发布了一个新的 C# source generator 来帮助改进应 ...

  2. 【JavaWeb】【Cookie】通过Cookie记录用户上次登陆时间并判断用户是否是首次登陆

    通过Cookie记录用户上次登陆时间并判断用户是否是首次登陆 Cookie类的构造方法 public Cookie(java.lang.String name,java.lang.String ) 1 ...

  3. 【Mybatis】学习笔记01:连接数据库,实现增删改

    需要数据库SQL的请跳转到文末 哔哩哔哩 萌狼蓝天 [转载资料][尚硅谷][MyBatis]2022版Mybatis配套MD文档 [Mybatis]学习笔记01:连接数据库,实现增删改 [Mybati ...

  4. Qt/C++音视频开发74-合并标签图形/生成yolo运算结果图形/文字和图形合并成一个/水印滤镜

    一.前言 在使用yolo做人工智能运算后,运算结果除了一个方框,还可能需要增加文字显示在对应方框上,以便标记是何种物体,比如显示是人还是动物,或者还有可能追踪人员,显示该人员的姓名.这种应用场景非常普 ...

  5. Qt编写地图综合应用45-路径规划

    一.前言 路径规划一般是根据起始点坐标经纬度和结束点坐标经纬度,查询出合适的路线.关于起始坐标和结束坐标,最开始做的是直接传入具体中文地址即可,后面百度地图不再开放此功能,貌似变成了收费功能,但是经纬 ...

  6. Supermap Objects API开发中禁用默认的选择集显示风格,启用自定义的显示风格的代码

    //#region 使用自定义风格设置选中状态 Selection selection = new Selection();//从该记录集获取选择集 selection.FromRecordset(r ...

  7. Redis 源码简洁剖析 01 - 环境配置

    fork Redis 源码 在 GitHub 上找到并 fork Redis 源码 https://github.com/redis/redis,然后在本地 clone 自己 fork 出来的源码项目 ...

  8. SpringBoot的两种启动方式原理

    使用内置tomcat启动 配置案例 启动方式 IDEA中main函数启动 mvn springboot-run java -jar XXX.jar 使用这种方式时,为保证服务在后台运行,会使用nohu ...

  9. linux内核 list_for_each_entry

    1. linux内核中的list用法 在linus内核中,list一般这样使用: struct list_head { struct list_head *priv; struct list_head ...

  10. python的typing模块

    python的typing模块 参考:3个提高 Python 开发效率的小工具.Python3 Typing模块详解 typeing模块在python中提供类型支持,主要功能有: 类型检查,防止运行时 ...