<?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. [Blazor] 一文理清 Blazor Identity 鉴权验证

    一文理清 Blazor Identity 鉴权验证 摘要 在现代Web应用程序中,身份认证与授权是确保应用安全性和用户数据保护的关键环节.Blazor作为基于C#和.NET的前端框架,提供了丰富的身份 ...

  2. Win11telnet服务怎么开启详细介绍

    很多用户想知道在windows11电脑中要如何开启telnet服务,用户这时候是打开windows11电脑的设置,接着点击应用设置中的可选功能,然后点击更多windows功能就能看到telnet客户端 ...

  3. maven:Could not transfer artifact from/to maven-default-http-blocker (http://0.0.0.0/): Blocked m...

    今天在拉完项目后拉取包的过程中,maven报错: Could not transfer artifact from/to 对应的包 maven-default-http-blocker (http:/ ...

  4. linux系统命令make.clean的用法讲解

    先先看一下什么是makefile makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 makefile就像一个Sh ...

  5. 【转载】Spring Cloud Gateway监控

    http://www.imooc.com/article/290822 欢迎加入Spring Cloud Gateway监控豪华套餐-- 只要为Spring Cloud Gateway添加Spring ...

  6. Qt/C++加载不同的地图控件/地图类型/缩放标尺/缩略图/比例尺/实时路况/全景视图等

    一.前言说明 在展示地图的时候,有些常规的操作,比如调整地图的缩放级别,切换到卫星图等,希望能够在地图上直接操作实现,于是就有了一堆地图控件,可以根据自己的需求动态的添加和删除,这样就更直接更快捷,而 ...

  7. Llama3.1 是怎么工作哒?原文翻译版😘

    了解Llama3.1如何工作--深入探讨模型流程 原文标题:Understand How Llama3.1 Works - A Deep Dive Into the Model Flow 原作者:Xi ...

  8. [转]OpenCV使用之-----BruteForceMatcher无法使用

    最近Opencv升级比较快,从2.4.0到2.4.1到2.4.2,使得我这个还在使用2.3.1的人很不好意思,而且听说新版本里添加了tbb并行功能,急着想用这些功能的我赶紧下了2.4.2. 按部就班的 ...

  9. 即时通讯安全篇(十):IM聊天系统安全手段之通信连接层加密技术

    本文由融云技术团队分享,原题"互联网通信安全之端到端加密技术",内容有修订和改动. 1.引言 随着移动互联网的普及,IM即时通讯类应用几乎替代了传统运营商的电话.短信等功能.得益于 ...

  10. 阿里IM技术分享(八):深度解密钉钉即时消息服务DTIM的技术设计

    本文引用自InfoQ社区"5亿用户如何高效沟通?钉钉首次对外揭秘即时消息服务DTIM"一文,作者陈万红等.策划褚杏娟,有修订和改动. 一.引言 本文是国内企业IM的事实王者钉钉首次 ...