<?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. 【数据结构】【直接排序法】Java代码

    public class 直接排序 { /** * 直接排序法 仅排序1轮 * @param arr 数组 * @param ji 基准索引,填写几,就以谁为基准进行一次划分 */ public st ...

  2. 【Linux】ps -ef|grep -v grep|awk '{print $2}' 命令详解

    前言 在Linux服务器中使用脚本时,经常见到ps -ef|grep xxx|grep -v grep|awk '{print $2}'这一句命令 前半部分的ps -ef|grep命令,相信经常接触L ...

  3. Qt数据库应用23-个人信息报表

    一.前言 自从上次做完的图文报表,又新来了个需求需要实现个人信息报表,类似个人简历一样的格式,数据从数据库中取出来,然后一个人的信息就打印一张,传入查询的多个人员信息,自动分页打印个人信息报表,报表可 ...

  4. Datawhale 2025冬令营“嬛嬛,我来啦!”😘

    Datawhale2025冬令营 Datawhale 2025 AI冬令营链接:https://www.datawhale.cn/activity/110/21/76?rankingPage=1 赠送 ...

  5. 使用学生优惠创建 Azure Database for MySQL 数据库

    前言 在此之前,你需要拥有一个已通过学生认证的 Azure 账户.关于通过 Azure 学生认证,网上已有大量教程,此处不再赘述. 前些日子认证通过了 Azure 的学生认证,在部署此网站时发现 Az ...

  6. linux输出文件名及全路径

    有时候需要输出一个文件夹下的文件名及所以绝对路径,在网上找到是这个命令 ls | sed "s:^:`pwd`/:" 看命令不难理解,先是ls列出所有文件名,再使用管道符进行后续操 ...

  7. WSL设置中文、修改默认Root登陆、添加右键菜单

    1.设置中文 首先安装 aptitude 管理工具 #apt-get install aptitude 然后安装语言环境并进入语言环境设置. #aptitude install locales #dp ...

  8. 记录小程序跳转h5,然后h5涉及下载文件的问题

    小程序跳转h5中,可以在小程序增加一个页面使用webView方式嵌套三方小程序,不过需要配置白名单 由于小程序的限制,不能在嵌套的h5中进行文件下载 网上也没有很好的解决方法,解决方法是再跳到小程序带 ...

  9. C#轻松实现条形码二维码生成及识别

    一.前言 大家好!我是付工. 今天给大家分享一下,如何基于C#来生成并识别条形码或者二维码. 二.http://ZXing.Net 实现二维码生成的库有很多,我们这里采用的是http://ZXing. ...

  10. 从SOA到RPC、SOAP、REST-copy

    从SOA说起SOA是把项目拆成组件,每个组件暴露出服务,强调的是服务的复用.SOA架构实现不依赖于技术,因此能够被各种不同的技术实现.例如:SOAP, RPC,REST,DCOM,CORBA,OPC- ...