中间件必须显式绑定到分组、资源或普通路由,不可依赖控制器构造函数的$this->middleware();tp6中route::resource()和闭包子路由不继承控制器级中间件,需在分组末尾链式调用->middleware(),且类路径、命名空间、handle()返回值及路由缓存均需正确配置。

确认中间件是否注册到分组路由
资源路由或普通路由分组若要使用中间件,必须显式绑定,不能依赖控制器构造函数里的 $this->middleware()。TP6 的 Route::resource() 和闭包定义的子路由不会自动继承控制器级中间件。
错误写法(中间件不生效):
Route::group('api', function () {
Route::resource('users', 'Api/User');
});
正确写法(在分组末尾链式调用 ->middleware()):
Route::group('api', function () {
Route::resource('users', 'Api/User');
})->middleware(\app\middleware\Auth::class);
检查中间件类路径与命名空间
中间件类必须满足以下条件才能被正确加载:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 文件路径为 app/middleware/Auth.php(以 Auth 为例)
- 类定义含完整命名空间:namespace app\middleware;
- 类名与文件名一致:class Auth
- 返回数组时需确保 app/middleware.php 中也注册了该类(全局中间件场景下)
若使用多应用模式(如 admin/api),中间件应放在对应应用目录下:app/admin/middleware/Auth.php,并在该应用的 middleware.php 中注册 \app\admin\middleware\Auth::class。
验证 handle() 方法是否规范返回
中间件失效最隐蔽的原因是 handle() 方法未返回 Response 实例。任何分支遗漏 return 都会导致请求中断,后续逻辑(包括控制器)全部跳过。
标准写法示例:
public function handle($request, \Closure $next)
{
if ($request->header('token') === null) {
return json(['code' => 401, 'msg' => '未授权']);
}
return $next($request); // 必须有 return
}
常见错误包括:
– 只写 $next($request) 而无 return
– 使用 die() 或 exit 中断流程
– 在 if/else 分支中某一分支漏掉 return
排除路由缓存与注册顺序干扰
修改路由后未清缓存,或分组定义被前置通配符路由覆盖,都会导致中间件看似“挂载成功”实则未执行。
- 执行命令清除路由缓存:php think route:clear
- 开发阶段可临时关闭缓存:在 config/route.php 中设 'route_cache' => false
- 运行 php think route:list | grep api/users,确认输出中 Action 列指向正确控制器,且 Middlewares 列包含你的中间件名
- 确保 Route::group() 不嵌套在其他条件判断、循环或闭包中,避免解析异常










