Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
PHP中间件开发:请求过滤实践_创想鸟

PHP中间件开发:请求过滤实践

中间件是在请求到达应用程序或响应返回客户端时执行特定逻辑的组件,常用于权限验证、日志记录等。1. 实现基于psr-15接口的中间件类,如ipfilter实现阻止黑名单ip访问的功能;2. 在框架中注册中间件,如laravel在kernel.php中注册,slim使用add方法添加;3. 中间件执行顺序按注册顺序依次执行,影响处理流程;4. 可通过依赖注入容器管理中间件依赖,如pimple中定义服务并注入;5. 使用phpunit进行单元测试和集成测试确保中间件功能正确;6. 异常处理可使用try-catch捕获并返回错误响应,同时记录日志;7. 选择支持中间件的框架或独立库,兼顾性能与可维护性。

PHP中间件开发:请求过滤实践

中间件,简单来说,就是请求到达你的应用程序之前,或者响应返回给客户端之后,你可以在中间“插一脚”,做点事情。在PHP开发中,这“一脚”可以用来做很多事情,比如权限验证、日志记录、请求修改,甚至是直接返回一个响应。

PHP中间件开发:请求过滤实践

请求过滤,是中间件一个很常见的应用场景。想象一下,你不想让某些IP地址访问你的网站,或者你想对所有POST请求进行一些预处理,中间件就能派上大用场。

PHP中间件开发:请求过滤实践

解决方案

立即学习“PHP免费学习笔记(深入)”;

PHP中间件开发:请求过滤实践

PHP中间件的实现方式有很多,这里介绍一种比较常见的基于PSR-15规范的实现方式。PSR-15定义了中间件接口,使得不同的框架和库之间可以更容易地共享中间件。

定义中间件接口: 虽然PSR-15已经定义了接口,但为了更灵活,你可以定义自己的接口,并实现PSR-15的接口。

namespace AppMiddleware;use PsrHttpMessageServerRequestInterface;use PsrHttpMessageResponseInterface;use PsrHttpServerMiddlewareInterface;use PsrHttpServerRequestHandlerInterface;interface RequestFilterInterface extends MiddlewareInterface{    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface;}

实现中间件: 创建一个类,实现你定义的接口。这个类将包含你的过滤逻辑。

namespace AppMiddleware;use PsrHttpMessageServerRequestInterface;use PsrHttpMessageResponseInterface;use PsrHttpServerRequestHandlerInterface;use LaminasDiactorosResponseJsonResponse; // 假设使用Laminas Diactorosclass IPFilter implements RequestFilterInterface{    private $blockedIps = ['192.168.1.100', '10.0.0.5'];    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface    {        $clientIp = $request->getServerParams()['REMOTE_ADDR'] ?? '0.0.0.0';        if (in_array($clientIp, $this->blockedIps)) {            return new JsonResponse(['error' => 'Access denied.'], 403);        }        return $handler->handle($request);    }}

注册中间件: 具体的注册方式取决于你使用的框架。

Laravel: 可以在app/Http/Kernel.php中注册全局中间件,或者在路由中注册单个中间件。Slim Framework: 使用$app->add()方法。其他框架: 查看框架文档,了解如何注册中间件。

例如,在Slim Framework中:

use AppMiddlewareIPFilter;$app->add(new IPFilter());

中间件的执行顺序: 中间件的执行顺序很重要。通常,先注册的中间件先执行。这意味着,如果你的权限验证中间件在日志记录中间件之前执行,那么只有通过权限验证的请求才会被记录。

PHP中间件如何与依赖注入容器集成?

依赖注入容器可以帮助你管理中间件的依赖关系,使得你的中间件更加灵活和可测试。

将中间件定义为服务: 将你的中间件类定义为依赖注入容器中的一个服务。

// 以Pimple为例$container['ip_filter'] = function ($c) {    return new AppMiddlewareIPFilter(); // 假设IPFilter不需要其他依赖};

在路由中使用容器: 在你的路由定义中,从容器中获取中间件实例。

$app->get('/users', function ($request, $response) use ($container) {    // ...})->add($container['ip_filter']);

构造函数注入: 如果你的中间件依赖于其他服务,可以通过构造函数注入依赖项。

namespace AppMiddleware;use PsrHttpMessageServerRequestInterface;use PsrHttpMessageResponseInterface;use PsrHttpServerRequestHandlerInterface;use AppServiceUserService; // 假设UserService是你的用户服务class AuthMiddleware implements RequestFilterInterface{    private $userService;    public function __construct(UserService $userService)    {        $this->userService = $userService;    }    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface    {        // 使用UserService进行用户验证        $token = $request->getHeaderLine('Authorization');        $user = $this->userService->validateToken($token);        if (!$user) {            return new JsonResponse(['error' => 'Unauthorized.'], 401);        }        // 将用户信息添加到请求属性中        $request = $request->withAttribute('user', $user);        return $handler->handle($request);    }}
// 在Pimple中注册$container['auth_middleware'] = function ($c) {    return new AppMiddlewareAuthMiddleware($c['user_service']);};

PHP中间件的测试方法是什么?

测试中间件的正确性至关重要。你需要确保中间件能够正确地处理各种情况,例如请求被阻止、请求被修改、请求被传递到下一个中间件等。

单元测试: 编写单元测试来测试中间件的独立功能。你可以使用PHPUnit或其他测试框架。

use PHPUnitFrameworkTestCase;use AppMiddlewareIPFilter;use LaminasDiactorosServerRequest;use LaminasDiactorosResponse;use PsrHttpServerRequestHandlerInterface;class IPFilterTest extends TestCase{    public function testBlockedIpReturnsForbidden()    {        $request = new ServerRequest([], [], null, 'GET', 'php://input', [], ['REMOTE_ADDR' => '192.168.1.100']);        $handler = $this->createMock(RequestHandlerInterface::class); // 使用Mock对象,因为我们不关心handler的执行        $middleware = new IPFilter();        $response = $middleware->process($request, $handler);        $this->assertEquals(403, $response->getStatusCode());        $this->assertStringContainsString('Access denied.', (string)$response->getBody());    }    public function testAllowedIpPassesThrough()    {        $request = new ServerRequest([], [], null, 'GET', 'php://input', [], ['REMOTE_ADDR' => '192.168.1.101']);        $handler = $this->createMock(RequestHandlerInterface::class);        $handler->expects($this->once()) // 确保handler被调用                ->method('handle')                ->willReturn(new Response());        $middleware = new IPFilter();        $response = $middleware->process($request, $handler);        $this->assertEquals(200, $response->getStatusCode()); // 假设handler返回200    }}

集成测试: 编写集成测试来测试中间件与其他组件的交互。这可以确保中间件在实际环境中能够正常工作。

模拟请求和响应: 在测试中,你需要模拟请求和响应对象。可以使用Laminas Diactoros或其他PSR-7实现来创建这些对象。

断言: 使用断言来验证中间件的输出是否符合预期。例如,你可以断言响应状态码、响应头、响应体等。

如何处理中间件中的异常?

在中间件中,可能会发生各种异常,例如数据库连接失败、用户认证失败等。你需要妥善处理这些异常,以避免应用程序崩溃。

try-catch块: 使用try-catch块来捕获异常。

namespace AppMiddleware;use PsrHttpMessageServerRequestInterface;use PsrHttpMessageResponseInterface;use PsrHttpServerRequestHandlerInterface;use LaminasDiactorosResponseJsonResponse;class ErrorHandlingMiddleware implements RequestFilterInterface{    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface    {        try {            return $handler->handle($request);        } catch (Exception $e) {            // 记录错误日志            error_log($e->getMessage());            // 返回错误响应            return new JsonResponse(['error' => 'Internal Server Error.'], 500);        }    }}

全局异常处理: 你还可以设置全局异常处理程序来捕获未被捕获的异常。这可以防止应用程序崩溃,并提供更好的用户体验。

日志记录: 记录异常信息,以便你可以诊断和修复问题。

自定义错误页面: 为用户显示友好的错误页面,而不是显示技术细节。

选择合适的中间件框架

选择合适的中间件框架可以简化中间件的开发和管理。

框架自带的中间件支持: 许多PHP框架都内置了中间件支持,例如Laravel、Slim Framework等。如果你正在使用这些框架,可以直接使用它们提供的中间件功能。

独立中间件库: 有一些独立的中间件库,例如Relay、Tuupola/Middleware等。这些库提供了更灵活的中间件管理方式,可以与任何PHP框架一起使用。

考虑性能: 中间件会增加请求处理的开销。选择性能良好的中间件框架,并避免编写过于复杂的中间件逻辑。

考虑可维护性: 选择易于理解和维护的中间件框架。遵循PSR-15规范,可以提高中间件的可移植性和可重用性。

以上就是PHP中间件开发:请求过滤实践的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1258923.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PHP怎样处理JWT刷新令牌 处理JWT令牌的4个关键要点
上一篇 2025年12月10日 05:57:53
PHP如何调用SWC转译器 SWC转译器调用指南加速代码编译
下一篇 2025年12月10日 05:58:02

相关推荐

  • VSCode搭建Flutter开发环境(移动开发,完整配置指南)

    本文详细指导如何在VSCode中搭建高效的Flutter开发环境,包括安装JDK、配置JAVA_HOME、安装Android Studio并设置ANDROID_HOME、安装VSCode及Flutter和Dart插件、配置FLUTTER_HOME环境变量,通过flutter doctor检查并解决A…

    2026年9月23日
    000
  • mysql安装后怎么变量 mysql系统变量配置与修改

    mysql安装后怎么变量 mysql系统变量配置与修改mysql安装后怎么变量 mysql系统变量配置与修改mysql安装后怎么变量 mysql系统变量配置与修改mysql安装后怎么变量 mysql系统变量配置与修改

    要查看和修改mysql系统变量,可通过sql命令或配置文件操作。一、查看变量用show variables或查询information_schema.global_variables;二、常见需调整变量包括max_connections、innodb_buffer_pool_size、wait_ti…

    2026年9月23日 • 用户投稿
    600
  • 优化 Laravel Nova 动作响应消息的持久性与用户体验

    本文探讨了在 Laravel Nova 中处理长时任务后,默认动作响应消息(Toast)短暂显示的问题。针对这一挑战,我们将介绍如何利用 Laravel Nova 4 提供的 NovaNotification 功能,实现持久化的、带有交互操作的通知,从而显著提升用户体验,确保重要信息不会因消息瞬时消…

    2026年9月23日
    100
  • 如何使用Optuna优化AI大模型训练?自动化调参的详细教程

    如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程如何使用Optuna优化AI大模型训练?自动化调参的详细教程

    Optuna通过智能搜索与剪枝机制,显著提升AI大模型超参数优化效率。它以目标函数封装训练流程,利用TPE等算法智能采样,结合ASHA等剪枝策略,在分布式环境下高效搜索最优配置,同时提供可复现性与可视化分析,降低调参成本。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 Dee…

    2026年9月23日 • 用户投稿
    000
  • Vue.js 项目中实现练习进度保存的策略与实践

    本文将探讨在vue.js项目中实现用户练习进度保存的最佳实践。针对需要跨会话保留用户进度的场景,我们将重点介绍如何利用浏览器localstorage进行数据持久化,包括数据的序列化与反序列化、在关键生命周期钩子中加载与保存数据,以及相关的注意事项,确保用户能够从上次中断的地方继续练习。 在开发基于V…

    2026年9月23日
    100
  • 苹果官网真品认证通道 iPhone序列号查验正品入口

    苹果官网真品认证通道为https://checkcoverage.apple.com/cn/zh/,用户可通过输入iPhone序列号查验设备激活状态、保修期限及技术支持覆盖情况,确保正品并降低二手交易风险。 苹果官网真品认证通道 iPhone序列号查验正品入口在哪里?这是不少网友都关注的,接下来由P…

    2026年9月23日
    200
  • Photopea中AI图片如何导出为PNG?快速保存图像的实用方法

    答案:在Photopea中导出AI生成图片为PNG,需点击“文件”→“导出为”→选择PNG,设置质量100%、勾选透明度并确认尺寸后保存;为平衡质量与文件大小,优先调整图像尺寸而非降低质量,高分辨率图片可缩放以优化;常见技巧包括使用高分辨率源图、保留图层非破坏性编辑;其他格式如JPEG适合无透明背景…

    2026年9月23日
    200
  • 如何使用Java制作简易的博客系统

    首先搭建Spring Boot后端,设计BlogPost实体类并用JPA实现数据持久化,通过BlogController处理页面请求,使用Thymeleaf模板引擎渲染index和create页面,配置H2内存数据库并启用控制台,最终实现文章的发布与展示功能。 用Java制作一个简易的博客系统,核心…

    2026年9月23日
    200
  • qq浏览器主页被篡改了如何修复_qq浏览器主页被篡改修复方法

    首先检查QQ浏览器设置中的主页地址并修正,接着查看桌面快捷方式目标路径是否被添加恶意网址并清理,然后使用腾讯电脑管家等工具扫描修复,最后可尝试重置浏览器或通过注册表编辑器锁定主页,防止再次被篡改。 QQ浏览器主页被篡改,通常是由恶意软件、插件或安全软件锁定导致的。修复的关键是检查多个可能被修改的位置…

    2026年9月23日
    100
  • 渗透测试|利用curl回传文件

    在处理低权限shell回传文件的问题时,如果无法使用scp命令且无法安装sshpass,可以考虑使用curl命令进行文件传输。以下是详细的伪原创内容: 至少我们曾经在一起过。 来自:一言 var xhr = new XMLHttpRequest();xhr.open(‘get’, ‘https://…

    2026年9月23日
    100
  • VSCode如何配置Scala开发环境 VSCode搭建Scala项目的完整教程

    首先安装jdk 11或17并正确配置java_home和path环境变量;2. 通过包管理器或官网安装sbt,用于项目构建与依赖管理;3. 在vscode中安装scala (metals)插件,以获得代码补全、错误检查等语言服务;4. 使用sbt new scala/scala-seed.g8创建项…

    2026年9月23日
    100
  • PHP面向对象高级特性_PHP高级OOP设计模式

    PHP高级OOP特性如命名空间、Traits、魔术方法等结合设计模式可提升代码质量。1. 命名空间避免类冲突,Traits实现横向复用,后期静态绑定支持运行时解析,魔术方法增强对象控制,抽象类与接口定义契约,Final防止继承修改。2. 单例确保唯一实例,工厂封装创建逻辑,依赖注入降低耦合,观察者实…

    2026年9月23日
    100
  • Airtable的AI混合工具怎么用?快速管理数据的智能化操作步骤

    Airtable的AI混合工具通过将AI能力嵌入数据管理流程,实现自动化处理、分析与内容生成。首先明确AI需求,如总结反馈或生成文案;接着选择AI字段或在自动化中添加AI动作;然后配置模型与提示词,精准设计指令以确保输出质量;指定输入输出字段后进行测试迭代,优化提示词直至满意;最后部署并持续监控。该…

    2026年9月23日
    100
  • 华为 Mate 70 Air 手机上架电信终端产品库 eSIM 方案成悬念

    10 月 21 日消息,华为一款型号为 sup-al90 的新机——华为 mate 70 air,目前已上架中国电信终端产品库。产品信息显示,该机型将提供曜金黑、羽衣白、金丝银锦三款配色,并预装 harmonyos 5.0 操作系统。 产品库信息显示 Mate70 Air 采用一块 6.9 英寸大屏…

    2026年9月23日
    300
  • 高德地图离线地图怎么更新_高德地图离线数据更新步骤

    高德地图车机版离线地图更新方法包括:一、通过Wi-Fi在线更新,进入“离线数据”页面检测并下载新版地图;二、使用U盘导入,从官网下载解压后复制amapauto文件夹至U盘根目录,插入车机并选择更新;三、开启Wi-Fi自动更新功能,在设置中启用“Wi-Fi下自动更新离线数据”及“离线图面增量更新”,实…

    2026年9月23日
    100
  • Laravel Nova 4 动作响应持久化:告别短暂Toast,拥抱长效通知

    本文探讨了Laravel Nova动作响应消息(Toast)持续时间过短的问题,特别是在处理耗时操作时。针对这一局限性,我们提供了利用Laravel Nova 4内置通知(NovaNotification)功能的解决方案,以实现更持久、可交互且用户友好的消息提示,确保用户即使在离开页面后也能及时获取…

    2026年9月23日
    000
  • AO3镜像站替代访问链接_AO3镜像站官方镜像站点

    AO3镜像站替代访问链接为https://nightalk.xyz,用户可通过主站或镜像站点登录账户,支持中文界面切换与多端同步阅读。 AO3镜像站替代访问链接在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来AO3镜像站官方镜像站点,感兴趣的网友一起随小编来瞧瞧吧! https://arc…

    2026年9月23日
    100
  • PHP高效读取大型GZ文件:揭示Gzip的顺序访问限制与实践方法

    本教程深入探讨了php中处理大型gz压缩文件的核心挑战:其固有的顺序访问特性。我们将解释为何无法对gz文件进行随机跳转读取,以及这意味着您必须从头开始按序解压数据。文章将提供一种实用的分块读取策略,并附带php示例代码,帮助开发者高效、安全地处理超大gz文件,同时讨论潜在的跨块数据处理问题及内存管理…

    2026年9月23日
    200
  • 如何在RayTune中训练AI大模型?分布式超参数优化的技巧

    如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧

    RayTune通过分布式超参数优化解决大模型训练中的资源调度、搜索效率、实验管理与容错难题,其核心是利用并行化和智能调度(如ASHA、PBT)加速最优配置探索。首先,将训练逻辑封装为可调用函数,并在其中集成分布式训练(如PyTorch DDP);其次,定义超参数搜索空间与资源需求(如每试验2 GPU…

    2026年9月23日 • 用户投稿
    100
  • mysql怎么执行子查询 mysql输入嵌套sql语句方法

    mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法

    mysql子查询常见类型包括标量子查询、行子查询和表子查询,分别返回一行一列、一行多列和多行多列数据;应用场景涵盖where作为过滤条件、from作为派生表、select作为标量列以及dml操作的数据提供。此外,根据与外部查询的关联性分为非关联子查询和关联子查询,前者独立执行一次,后者依赖外部查询每…

    2026年9月23日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信