ThinkPHP升级后中间件不生效的主因是注册位置错误、未显式返回响应或命名空间路径错误;需检查app/middleware.php是否存在且返回正确类名数组,确认绑定方式(路由/分组/控制器级),验证中间件类生成规范、handle方法签名及return语句,多应用下注意中间件路径与命名空间匹配,并确保Auth::setUser()正确调用。

升级ThinkPHP后中间件不生效,最常见的情况是注册位置错误、未显式返回响应、或命名空间路径写错——不是框架坏了,而是加载链在某一个环节断开了,请求根本没走到你的中间件里。
检查中间件是否被正确注册
TP6+废弃了TP5.x的全局函数式路由注册,也重构了中间件加载机制。app/middleware.php文件只对「应用级」中间件生效,且必须存在、必须返回数组、数组元素必须是完整类名字符串(带命名空间)。
打开 app/middleware.php,确认它存在且内容类似:
return [
\app\middleware\AuthCheck::class,
\think\middleware\SessionInit::class
];
立即学习“PHP免费学习笔记(深入)”;
常见错误:删掉该文件、改名为middleware.php.bak、写了echo或return null、返回空数组或非数组类型——这些都会导致整个中间件列表加载失败。
【务必确认该文件真实存在且无BOM头、无额外输出】
确认中间件绑定方式是否匹配场景
全局中间件 ≠ 所有请求都走它。权限校验、API鉴权这类细粒度控制,必须通过路由级或控制器级绑定才生效。
方法一:路由级绑定(推荐用于API权限)
Route::get('admin/user/list', 'Admin/UserController@list')->middleware(\app\middleware\AuthCheck::class);
方法二:路由分组绑定(适合整组接口)
Route::group('api', function () {
Route::get('user/info', 'Api/UserController@info');
})→middleware(\app\middleware\ApiAuth::class);
方法三:控制器级绑定(仅限当前控制器)
在控制器构造函数中写:
$this->middleware(\app\middleware\AuthCheck::class);
注意:资源路由 Route::resource() 不会自动继承控制器构造函数里的中间件,每个动作需单独指定。
验证中间件类是否生成正确
第一步:用命令行生成中间件,避免手写出错
php think make:middleware AuthCheck
第二步:确认文件路径为 app/middleware/AuthCheck.php,命名空间为 app\middleware,类名与文件名严格一致
第三步:检查类中 handle() 方法签名是否为:
public function handle($request, \Closure $next)
第四步:确保每个分支都有显式 return:
✅ 放行:return $next($request);
❌ 错误:if (!Auth::check()) { abort(403); } ——漏掉 return $next($request) 会导致函数末尾隐式返回 null,框架直接中断请求
多应用模式下中间件位置容易错
启用 multi_app 或子应用(如 admin、api)时,中间件不能放在 app/middleware/ 下就完事。
若中间件只用于 admin 应用:
① 把文件移到 app/admin/middleware/AuthCheck.php
② 命名空间改为 app\admin\middleware
③ 在 app/admin/middleware.php 中注册(不是全局 app/middleware.php)
④ 路由定义必须指向该应用,例如 Route::get('admin/user', 'admin/User/index')
切勿把中间件放在子目录如 app/middleware/auth/AuthCheck.php——框架默认不扫描子目录。
Session 和 Auth 状态未注入导致校验失效
前后端分离项目中,Auth::check() 返回 false 并不一定是中间件没跑,而是登录态根本没注入。
登录成功后必须立刻执行:
Auth::setUser($user->id);
否则 Auth::check() 永远为 false,中间件看似运行了,实则每次都拦截——这不是中间件问题,是认证链断在了源头。
注意:Auth::setUser() 不等同于写 session 或发 token,它是 ThinkPHP Auth 组件内部状态初始化的唯一入口。



















