middleware.php必须返回含完整类名字符串的数组,仅支持app/middleware.php路径,类需可自动加载且handle方法签名正确、必须返回response实例。

middleware.php 必须返回数组,且元素是完整类名字符串
这个文件不是 PHP 类,而是纯配置脚本,框架通过 include 直接加载它并期望得到一个数组。任何额外输出(echo、BOM 头、注释外空格)、use 语句或非数组返回值都会导致中间件静默失效。
- ✅ 正确写法(TP6/TP8 通用):
return [ \think\middleware\SessionInit::class, \app\middleware\CheckAuth::class ]; - ❌ 常见错误:
-
return ['app\middleware\CheckAuth'];—— 缺少开头反斜杠,PHP 在当前命名空间下找类,报Class "app\middleware\CheckAuth" not found -
use app\middleware\CheckAuth; return [CheckAuth::class];——use在此文件中完全被忽略 -
return null;或echo 'test'; return [...];—— 加载失败,框架跳过整个文件
-
全局中间件只认 app/middleware.php,别放错位置
TP6 和 TP8 都只从 app/middleware.php 加载全局中间件。哪怕你项目启用了多应用(如 app/admin),主应用的全局中间件仍必须放在这里,子应用的中间件要单独配在 app/admin/middleware.php 中。
- 多应用下,
app/admin/middleware.php只影响admin应用,不影响主应用或其他子应用 - 不要把中间件类放在子目录里,比如
app/middleware/auth/CheckAuth.php—— 框架默认不扫描子目录,类根本不会被自动加载 - 命令行生成最安全:
php think make:middleware CheckAuth,它会自动建在app/middleware/CheckAuth.php,命名空间固定为app\middleware
类名写法有三种,但推荐用 ::class 语法
数组元素支持三种形式,但稳定性差异大:
-
\app\middleware\CheckAuth::class—— ✅ 最推荐,类型安全,IDE 可跳转,TP6/TP8 兼容性最好 -
'app\middleware\CheckAuth'—— ⚠️ 可用但易出错,漏写反斜杠或大小写不一致时,运行时报错而非编译期提示 -
new \app\middleware\CheckAuth()—— ❌ 不推荐,实例化时机不可控,可能破坏中间件单例语义,TP8 在 PHP 8.1+ 下易触发BindingResolutionException
注意:所有类名必须能被 Composer 自动加载,确保 composer dump-autoload 已执行(尤其手动创建文件后)。
中间件类本身要满足 handle() 签名和返回要求
middleware.php 只负责“告诉框架用哪个类”,真正执行靠类里的 handle() 方法。如果这个方法写错,中间件虽被加载,但请求会卡死或返回空白。
- 签名必须是:
public function handle($request, \Closure $next)(TP6/TP8 均严格校验) - 必须有
return,且返回值必须是think\Response实例:// 放行:进入下一环节 return $next($request); // 拦截:返回响应 return json(['code' => 403]); // 错误写法(静默中断): // echo 'forbidden'; die(); // return 'string'; // return ['data' => 1];
- 若需传参(如角色名),注册时加参数:
->middleware(\app\middleware\AuthCheck::class, 'admin'),则handle()可多接一个参数:handle($request, $next, $role)
最容易被忽略的是:没检查 app/middleware.php 是否真被框架读到——删掉它试试,如果没报错,说明你压根没走这个文件(可能配置了其他路径,或用了旧版的 config/middleware.php 方式)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











