全局中间件适用于所有请求必经的入口级逻辑,如跨域头、请求日志、基础安全头;路由中间件适用于按路径或角色隔离的业务逻辑,如权限校验、限流、版本分发,二者执行顺序为全局→路由→控制器,需据作用范围与性能影响合理选择。

选全局还是路由中间件,关键看功能作用范围和性能影响。该统一处理的放全局,需按业务隔离的放路由。
哪些适合全局中间件
跨域头、请求日志、多语言初始化、基础安全头(如X-Content-Type-Options)这类所有请求都必须经过的逻辑,适合放在全局中间件里。它们不区分接口类型或用户角色,属于入口级兜底处理。
- 在 app/middleware.php 中按顺序添加类名,数组靠前的先执行
- 避免把高耗时操作(如远程鉴权、文件读取)放在这里,否则拖慢所有请求
- 不要在全局中间件里做业务判断(比如“只对 /api/* 生效”),那会增加无谓开销
哪些适合路由中间件
权限校验(如后台路由加 AdminAuth)、接口限流(ApiRateLimit)、数据签名验证、版本路由分发等,只针对特定路径或模块生效的功能,应使用路由中间件。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 直接在 route/app.php 里绑定:
Route::get('admin/user', 'admin.user/index')->middleware(\app\middleware\AdminAuth::class); - 支持分组批量绑定:
Route::group('admin', function () { ... })->middleware(...); - 同一个中间件类可多次复用,比如
AuthCheck::class同时用于/api/v1和/admin分组
混用时要注意执行顺序
ThinkPHP 的执行流程是:全局中间件 → 路由中间件 → 控制器方法。即使你在路由定义里写得晚,它也一定在全局之后、控制器之前运行。
- 如果某中间件既注册为全局又绑定到某条路由,它会被执行两次——除非你内部加了幂等控制(例如用
$request->has('auth_checked')标记) - 多个路由中间件按链式调用顺序执行,
->middleware([A::class, B::class])表示 A 先于 B - 全局中间件数组中,索引 0 的最先执行,索引最后的最晚执行(但在路由中间件之前)
怎么判断该放哪一级
问自己三个问题:
- 这个逻辑是否每秒都要跑几百次?如果是,且只服务于少数接口,别放全局
- 它是否依赖 URL 路径、路由分组或请求参数?是的话,路由中间件更精准
- 它会不会因前置处理导致后续中间件或控制器拿不到原始输入(比如提前读了 php://input)?全局位置越靠前,风险越高
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










