中间件不生效八成是未注册、未return或路径/命名空间错误;需确保app/middleware.php存在且返回含完整命名空间类名的数组,多应用下须放对应子目录,handle()必须返回Response实例并显式调用$next($request)。

中间件不生效,八成是没注册、没 return 或路径/命名空间写错——不是框架问题,是加载链断在了最基础的环节。
检查 app/middleware.php 是否存在且返回正确数组
这个文件是全局中间件的唯一入口,必须存在、不能改名、不能删。它必须返回一个包含完整类名字符串的数组,例如:
-
正确写法:
return [\app\middleware\AuthCheck::class];或return ['app\middleware\AuthCheck']; -
常见错误:文件被删除、内容写了
echo或return null、返回空数组或非数组、类名漏写命名空间 - 多应用模式(如启用
app/multi_app)下,该文件需放在对应应用目录下(如app/admin/middleware.php),全局配置不生效
确认中间件类是否生成规范
用命令行生成最省事,避免手写路径或命名空间出错:
- 运行
php think make:middleware AuthCheck,自动生成app/middleware/AuthCheck.php - 类名必须与文件名严格一致,命名空间固定为
app\middleware - 别放在子目录里(如
app/middleware/auth/AuthCheck.php),框架不扫描 - 文件开头不能有 BOM 头、
echo或注释外的任何输出,否则加载时可能直接失败
确保 handle() 方法签名和返回值正确
handle() 是唯一入口,必须严格遵循规则:
立即学习“PHP免费学习笔记(深入)”;
- 签名必须是
handle($request, \Closure $next),少一个参数都不行 - 必须显式
return,且返回值必须是think\Response实例 - 放行写法:
return $next($request);—— 这是进入下一层的唯一通道 - 拦截写法:
return json(['code' => 401]);或return redirect('/login');,禁用echo或die() - 漏掉
return或返回null/string/array,请求会静默中断
验证路由是否真正绑定了中间件
ThinkPHP 5.1 不支持控制器构造函数或注解自动挂载中间件,必须显式绑定:
- 路由级绑定:
Route::get('user', 'User/index')->middleware(\app\middleware\AuthCheck::class); - 若用资源路由:
Route::resource('admin/user', 'Admin/UserController'),需单独为每个操作指定,如->middleware('auth') - 字符串别名(如
'auth')需先在app/middleware.php中注册映射 - 光写路由定义不加
->middleware(),中间件完全不会触发



















