PHP中间件:ThinkCMF 6.x核心利器解析

早安!今天我们进阶到一个现代 PHP 开发必备,也是 ThinkCMF 6.x 架构中的核心利器:中间件(Middleware)

在之前的分享中,我们聊了如何在控制器或 Service 里写逻辑。但有些逻辑是"通用且霸道"的,比如:全站维护模式切换、API 访问频率限制、非法 IP 封禁。如果把这些写在每个控制器里,代码会变得非常臃肿。


📅 今日知识点:利用中间件实现"洋葱模型"拦截

核心逻辑:

中间件就像是进入你网站大门的一道道"安检"。请求(Request)在到达你的控制器之前,必须一层层穿过这些中间件;响应(Response)在返回给用户前,也要再次经过它们。

1. 实战场景:给 API 增加一个"简易防刷"功能

假设你需要对某些敏感接口进行访问频率限制。

第一步:创建中间件

app/middleware 目录下创建 ApiCheck.php:

php 复制代码
namespace app\middleware;

class ApiCheck
{
    public function handle($request, \Closure $next)
    {
        // 1. 前置行为:控制器执行前的检查
        $token = $request->header('XX-Token');
        
        if (empty($token)) {
            return json(['code' => 0, 'msg' => '非法请求,Token 不能为空']);
        }

        // 2. 执行后续逻辑(进入控制器)
        $response = $next($request);

        // 3. 后置行为:在返回结果前加点料(如增加安全头)
        $response->header(['X-Platform' => 'ThinkCMF-v6']);

        return $response;
    }
}
2. 灵活注册(按需配置)

ThinkCMF 支持三种粒度的中间件注册:

  • 全局中间件 :在 config/middleware.php 定义,所有请求都会经过它。
  • 路由中间件:只针对特定路由生效(最推荐)。
  • 控制器中间件 :直接在 Controller 的 $middleware 属性里定义。
3. 为什么不直接在 initialize() 里写?

虽然控制器基类的 initialize() 也能拦截,但中间件有两个杀手锏:

  1. 脱离控制器:在路由匹配阶段就能拦截,不需要实例化控制器,性能更高。
  2. 链式处理:你可以像剥洋葱一样,先检查黑名单,再检查登录,最后检查权限,逻辑层次分明。

💡 开发建议

  • 权限校验用中间件:特别是 API 开发,使用中间件结合 JWT 是标准姿势。
  • 日志记录用中间件:可以完整记录请求参数和执行后的结果。

🛠️ 今日小结

如果你的逻辑是关于**"准入控制""全局过滤"**的,不要犹豫,直接上中间件。它能让你的控制器变得无比清爽,只关心业务逻辑本身。

今日金句: 好的架构师是"守门员",在 Bug 到达球门(控制器)之前就将其铲出场外。


相关推荐
为何创造硅基生物7 小时前
C语言 结构体内存对齐规则(通俗易懂版)
c语言·开发语言
吃好睡好便好7 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
星寂樱易李7 小时前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
仰泳之鹅7 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
之歆7 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
cen__y9 小时前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
AI人工智能+电脑小能手9 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
社交怪人9 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
郭涤生10 小时前
不同主机之间网络通信-以太网连接复习
开发语言·rk3588
山居秋暝LS10 小时前
【无标题】RTX00安装paddle OCR,win11不能装最新的,也不能用GPU
开发语言·r语言