PHP中间件实现

 

目录

1、简单中间实现

 2、使用闭包函数实现中间件


在PHP中,中间件是一种常用的设计模式,用于处理请求和响应,它可以在请求到达目标处理程序之前或响应发送给客户端之前执行一些特定的逻辑。中间件提供了一种灵活的方式来修改或扩展应用程序的功能。

1、简单中间实现

先调用中间件->在中间件调用处理程序->处理程序逻辑


// 定义中间件接口
interface Middleware
{
    public function handle($request, $next);
}
// 实现示例中间件类
class ExampleMiddleware implements Middleware
{
    public function handle($request, $next)
    {
        // 在处理请求之前执行的逻辑
        echo "执行中间件的逻辑<br>";
        // 调用下一个中间件或目标处理程序
        return $next->handle($request, $next);
    }
}
// 定义目标处理程序类
class TargetHandler
{
    public function handle($request, $next)
    {
        // 处理请求并返回响应
        echo "处理请求并返回响应<br>";
        return "响应数据";
    }
}
// 创建中间件实例
$middleware = new ExampleMiddleware();
// 创建目标处理程序实例
$handler = new TargetHandler();
// 执行中间件
$response = $middleware->handle("请求数据", $handler);
// 输出最终的响应
echo "最终的响应:".$response;

 2、使用闭包函数实现中间件
<?php
// 定义一个中间件类
class Middleware
{
    public function __construct() {
        // 构造函数
    }

    public function handle($request, $next) {
        // 在处理请求之前执行的逻辑
        echo "执行中间件的逻辑1<br>";

        // 调用下一个中间件或目标处理程序
        $response = $next($request);

        // 在处理响应之前执行的逻辑
        echo "执行中间件的逻辑2<br>";

        return $response;
    }
}
// 定义一个目标处理程序
class TargetHandler
{
    public function handle($request) {
        // 处理请求并返回响应
        echo "处理请求并返回响应<br>";
        return "响应数据";
    }
}
// 创建中间件实例和目标处理程序实例
$middleware = new Middleware();
$handler = new TargetHandler();
// 使用闭包函数实现中间件调用链
$middlewareChain = function($request) use ($middleware, $handler) {
    return $middleware->handle($request, function($request) use ($handler) {
        return $handler->handle($request);
    });
};
// 执行中间件调用链
$response = $middlewareChain("请求数据");
// 输出最终的响应
echo "最终的响应:".$response;

在上述示例中,中间件类中的 handle 方法接收请求和一个 next 回调函数作为参数。它首先执行一些在处理请求之前需要进行的逻辑,然后通过调用 $next($request) 来调用下一个中间件或目标处理程序。在响应返回之前,它还可以在 handle 方法中执行一些在处理响应之前需要进行的逻辑。 创建中间件调用链时,可以使用闭包函数将多个中间件连接在一起。每个中间件都通过调用下一个中间件或目标处理程序来传递请求,并在处理响应之前可以执行一些逻辑。 最后,通过执行中间件调用链,实现了多个中间件的按顺序执行,并返回最终的响应数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/179470.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库数据恢复—MongoDB数据库文件拷贝出现错误的数据恢复案例

MongoDB数据库数据恢复环境&#xff1a; 一台Windows Server操作系统的虚拟机&#xff0c;虚拟机上部署有MongoDB数据库。 MongoDB数据库故障&检测&#xff1a; 在未关闭MongoDB服务的情况下&#xff0c;工作人员将MongoDB数据库文件拷贝到其他分区&#xff0c;然后将原数…

Dubbo从入门到上天系列第十八篇:Dubbo引入Zookeeper等注册中心简介以及DubboAdmin简要介绍,为后续详解Dubbo各种注册中心做铺垫!

文章目录 一&#xff1a;Dubbo注册中心引言 1&#xff1a;什么是Dubbo的注册中心&#xff1f; 2&#xff1a;注册中心关系图解 3&#xff1a;引入注册中心服务执行流程 4&#xff1a;Dubbo注册中心好处 5&#xff1a;注册中心核心作用 二&#xff1a;注册中心实现方案 …

bclinux aarch64 ceph 14.2.10 云主机 性能对比FastCFS vdbench

部署参考 ceph-deploy bclinux aarch64 ceph 14.2.10-CSDN博客 ceph-deploy bclinux aarch64 ceph 14.2.10【3】vdbench fsd 文件系统测试-CSDN博客 ceph 14.2.10 aarch64 非集群内 客户端 挂载块设备-CSDN博客 FastCFS vdbench数据参考 bclinux aarch64 openeuler 20.03 …

每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树

每日一题系列&#xff08;day 01&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

汇编-PROTO声明过程

64位汇编 64 模式中&#xff0c;PROTO 伪指令指定程序的外部过程&#xff0c;示例如下&#xff1a; ExitProcess PROTO ;指定外部过程&#xff0c;不需要参数.code main PROCmov ebx, 0FFFFFFFFh mov ecx,0 ;结束程序call ExitProcess ;调用外部过程main ENDP END 32位…

IO口电压下降那么多是怎么回事??

前几天一个工程师向我反馈他测得如下电路MCU IO口的电压不是3.3V&#xff0c;只有2V多。 IO配置的是输入功能&#xff0c;无上下拉。最初我不太相信这个结果&#xff0c;后来自己用万用表实际测量了下&#xff0c;还真是这个结果 这是咋回事呢&#xff1f;不应该电压就是3.3V吗…

智能小车速通版——手把手教程

考虑到大部分学校&#xff0c;会发放简易小车来作为智能车初期培训和筛选的工具&#xff0c; 于是&#xff0c;我写一个简单的教程&#xff0c;能够实现简单小车的电磁循迹。 通过这个教程&#xff0c;能够通过简化的步骤搭建寻迹小车&#xff0c;进而了解整个智能车是如何实…

Linux网络——传输层

目录 一.再谈端口概念 二.UDP协议 1.UDP协议格式 2.UDP的特点 3.面向数据报 4.UDP的缓冲区 5.UDP使用注意事项 6.UDP协议在内核中的表现形式 7.基于UDP的应用层协议 三.TCP协议 1.TCP协议格式 2.TCP确认应答机制 3.超时重传机制 4.TCP报文六位标志位 5.滑动窗口 6…

SpringBoot整合knife4j生成Api文档

一、介绍 先看效果 ①&#xff1a;Swagger 介绍 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务(https://swagger.io/)。 它的主要作用是&#xff1a; 使得前后端分离开发更加方便&#xff0c;有利于团队协作 接口的文档…

Axios简单使用与配置安装-Vue

安装Axios npm i axios main.js 导入 import Axios from axios Vue.prototype.$axios Axios简单发送请求 get getTest() {this.$axios({method: GET,url: https://apis.jxcxin.cn/api/title?urlhttps://apis.jxcxin.cn/}).then(res > {//请求成功回调console.log(res)}…

从0开始学习JavaScript--JavaScript生成器

JavaScript生成器&#xff08;Generator&#xff09;是一项强大的语言特性&#xff0c;它允许函数在执行过程中被暂停和恢复&#xff0c;从而实现更灵活的控制流。本文将深入探讨JavaScript生成器的基本概念、用法&#xff0c;并通过丰富的示例代码展示其在实际应用中的优势和强…

Web应用系统的小安全漏洞及相应的攻击方式

1 写作目的 本文讲述一个简单的利用WebAPI来进行一次基本没有破坏力的“黑客”行为。 主要目的如下&#xff1a; 了解什么叫安全漏洞知道什么是api了解一些获取api的工具通过对API的认识了解白盒接口测试基本概念和技术 免责声明&#xff1a; 本文主要是以学习交流为目的…

基于SSM+Vue的社区共享食堂管理系统

基于SSM的社区共享食堂管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringMyBatisSpringMVC工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 菜品详情 管理员界面 摘要 社区共享食堂管理系统是一种基于SSM&#xf…

opencv-直方图

直方图是一种对图像亮度分布的统计表示&#xff0c;它显示了图像中每个灰度级别的像素数量。在OpenCV中&#xff0c;你可以使用cv2.calcHist() 函数计算直方图。 以下是一个简单的示例&#xff0c;演示如何计算和绘制图像的直方图&#xff1a; import cv2 import numpy as np …

Raspberry Pi 5 新一代单板计算机:树莓派5代 (介绍、入门、解疑)

树莓派5代正式发布后&#xff0c;硬件和性能的全面升级让众多开发者们都想入手感受一波&#xff0c;外观上Raspberry Pi 5 与前代产品非常相似&#xff0c;不过&#xff0c;在保留信用卡大小的整体尺寸的同时&#xff0c;也更新了一些设计元素&#xff0c;以适应新芯片组的功能…

色彩(2)调试喜好——适用于camera tuning

#灵感# 色彩是一种易感知的图像属性。 目录 1、消费级的camera 产品&#xff0c;最关注的是“肤色”。 2、受欢迎的颜色风格&#xff1a; 3、颜色误差 4、颜色调整方法 5、影响颜色的模块 1、消费级的camera 产品&#xff0c;最关注的是“肤色”。 家用监控产品输出的图…

matlab 最小二乘拟合平面并与XOY平面对齐

目录 一、算法原理二、代码实现1、绕原点对齐2、绕质心对齐三、结果展示1、绕原点对齐2、绕质心对齐四、测试数据本文由CSDN点云侠原创,原文链接。爬虫网站自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 首先,使用最小二乘拟合平面…

Mac | Vmware Fusion | 分辨率自动还原问题解决

1. 问题 Mac的Vmware Fusion在使用Windows10虚拟机时&#xff0c;默认显示器配置如下&#xff1a; 开机进入系统并变更默认分辨率后&#xff0c;只要被 ⌘Tab 切换分辨率就会还原到默认&#xff0c;非常影响体验。 2. 解决方式 调整 设置 -> 显示器 -> 虚拟机分辨率…

OV9281 调试记录

一、基本概念 HTS width_number_of_effective_cloumnsH_Blank&#xff0c;图像宽度行消隐 VTS height_number_of_effective_rows V_Blank&#xff0c;图像高度场消隐 OV9281 sensor array layout如下&#xff1a; 二、帧率配置 1、clock diagram 2、PLL configuration …