路由中间件必须显式调用middleware()才会执行,否则即使已注册也完全不触发;需确保app/middleware.php正确返回类名数组或别名映射,且路由中调用形式与注册方式严格一致。

路由中间件必须显式调用 middleware() 才会执行
不写 ->middleware('auth'),哪怕路由在 admin/ 下、中间件已注册,也完全不触发——ThinkPHP 不会自动继承或推测你要用哪个中间件。
常见错误现象:路由定义完了,中间件类也写了、app/middleware.php 里也返回了类名,但请求进来毫无反应。问题就卡在漏掉了这一步链式调用。
-
Route::get('user', 'User/index')→ 中间件不执行 -
Route::get('user', 'User/index')->middleware('auth')→ 正确生效 - 闭包路由同理:
Route::get('test', function(){...})->middleware('log') - 资源路由、规则路由(
rule())也都必须单独加middleware()
中间件名必须和 app/middleware.php 注册的键名或类名一致
别名写错、大小写不一致、少了命名空间,都会报 Middleware not found: xxx。
注册方式有两种,对应调用写法不同:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 如果
app/middleware.php返回的是类名数组:return [\app\middleware\AuthCheck::class];,那么路由中必须写全类名:->middleware(\app\middleware\AuthCheck::class) - 如果注册的是字符串别名:
return ['auth' => \app\middleware\AuthCheck::class];,路由中才能用->middleware('auth') - 混用会失败:注册了类名却传字符串别名,或注册了别名却传类名,框架都找不到
路由分组里绑定中间件,不能靠“嵌套继承”
ThinkPHP 的分组是扁平结构,Route::group('admin', ...)->middleware('auth') 只影响该分组内直接定义的路由,不会透传给子分组。
典型踩坑场景:
- 外层绑了
auth,内层Route::group('admin/user', ...)却没再绑,结果/admin/user路由裸奔 - 用
bind()和group()链式混写,比如Route::bind(...)->group(...)->middleware(...),中间件实际绑定到了bind上,无效 - 需要多级控制,建议统一前缀 + 条件判断,或把细化逻辑下放到控制器中间件(
$this->middleware())
传参和多中间件顺序要小心
中间件参数不是所有写法都支持,顺序也直接影响执行流。
- 单个中间件传参只支持字符串形式:
->middleware('throttle:60,1')或->middleware(\app\middleware\Throttle::class, '60,1');闭包或数组不支持额外参数 - 多个中间件用数组传入:
->middleware(['auth', 'log']),执行顺序就是数组索引顺序 - 统一给多个中间件传同一参数:
->middleware(['auth', 'log'], 'admin'),要求每个中间件的handle()方法都支持第三个参数 - 性能敏感路径慎用过多中间件,每层都要调用
$next($request),链越长延迟越高
$request->routeInfo() 可能为空,handle() 里取不到路由信息——这时候得先确认中间件是否挂载在路由解析之后。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










