app/middleware.php 是全局中间件唯一注册入口,必须存在且仅返回含完整类名字符串的数组;执行顺序严格按数组下标从上到下;handle() 必须返回 response 实例,放行仅通过 $next($request);别名和分组配置已移至 config/middleware.php。

app/middleware.php 是全局中间件唯一注册入口
ThinkPHP 不会自动扫描或加载中间件类,app/middleware.php 是全局中间件生效的**强制出口**——删了它、返回非数组、或写错类名,中间件就彻底不执行。
这个文件必须存在,且只做一件事:返回一个包含完整类名字符串的数组。常见错误包括:
- 误写成
return [\app\middleware\Auth::class];(少了反斜杠)→ 应为return [\app\middleware\Auth::class];或return ['app\middleware\Auth']; - 加了
echo、var_dump或 BOM 头 → PHP 解析失败,整个中间件栈静默失效 - 返回空数组
return [];或return null;→ 框架跳过加载,无报错但也不起效 - 路径写成
app/middleware/auth/Auth.php→ 框架只扫描app/middleware/一级目录,子目录类不会被发现
中间件执行顺序由数组索引决定,不是“谁在前谁先执行”
TP6+ 的全局中间件执行顺序,严格按 app/middleware.php 数组的**下标顺序从上到下**执行。这不是语义优先级,而是硬性生命周期链。
比如你希望语言切换生效,就必须确保 \think\middleware\Lang::class 排在 \think\middleware\SessionInit::class 之后、路由调度之前;若把它放在最后,cookie('think_lang') 就读不到,Lang::setLang() 就白调了。
安全类中间件也一样:ForceHttpsMiddleware 必须最靠前,ValidatePostSize 紧跟其后,而 AuthMiddleware 必须在 ParseJsonBody 之后、Logger 之前——顺序错一环,就可能拿不到 POST 数据、漏鉴权、或日志里没记录拦截动作。
handle() 方法必须返回 Response 实例,且 $next($request) 是唯一放行通道
中间件的 handle() 方法签名固定为 handle(Request $request, \Closure $next),返回值必须是 think\Response 实例。任何偏离都会导致请求中断或空白响应。
放行逻辑只有一条路:return $next($request);。写成 $next($request); return response()->success(); 就等于绕过了后续所有中间件和控制器,直接返回成功响应——这在鉴权中间件里是严重漏洞。
拦截逻辑要提前 return:
- 权限不足 →
return json(['code' => 403]);或return redirect('/login'); - 非法请求 →
return response('', 400); - 绝不能用
die()、exit、echo→ 这些不返回 Response,框架无法接管响应头和状态码
别名和分组配置已移至 config/middleware.php,app/middleware.php 不再支持 alias
TP6 起,app/middleware.php 只负责“列类名”,不再承担别名定义或优先级排序。那些写在旧文档里的 'alias' => [...] 或 'priority' => [...] 配置,现在必须挪到 config/middleware.php 中。
如果你还在 app/middleware.php 里写 return ['auth' => \app\middleware\Auth::class];,它会被当成一个字符串键名处理,类根本不会被实例化。
正确做法是两步分离:
-
app/middleware.php:只写return [\app\middleware\Auth::class, \app\middleware\Cors::class]; -
config/middleware.php:用'alias'定义别名,用'priority'控制部分中间件的前置/后置行为(如日志必须靠后)
多应用模式下,每个应用自己的 app/{name}/middleware.php 仍只管本应用的全局中间件列表,不共享别名配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











