ThinkPHP路由分组必须显式调用middleware()方法绑定中间件才生效,否则请求直接穿透至控制器;中间件名须与app/middleware.php中注册的键名一致,支持数组顺序执行,嵌套分组不继承外层中间件,bind()与group()不可链式混用。

路由分组必须显式调用 middleware() 才生效
ThinkPHP 的路由分组本身不带任何中间件执行逻辑,middleware() 不是可选修饰,而是强制绑定动作。漏掉这一步,哪怕路径写在 admin/ 分组里,请求也直接穿透到控制器,完全不走鉴权、日志、限流等逻辑。
常见错误现象:Route::group('admin', function(){ ... }) 里定义了几十条路由,但没链式调用 ->middleware('auth'),结果未登录用户能直接访问 /admin/user/delete。
- 必须写在分组闭包定义之后、分号之前,例如:
Route::group('admin', function(){ ... })->middleware('auth'); - 中间件名必须与
app/middleware.php中注册的键名一致(如'auth' => \app\middleware\Auth::class),不能写类全名或别名错位 - 支持数组传多个,顺序即执行顺序:
->middleware(['auth', 'log', 'throttle:60,1']) - 闭包路由同样适用:
Route::get('test', function(){...})->middleware('auth');
bind() 和 group() 别混着链式调用
两者机制不同:bind() 是变量约束(比如把 :id 自动转成整型),group() 是路由组织单元。如果写成 Route::bind('user', 'User')->group('user', ...)->middleware(...),这个 middleware() 实际被挂到了 bind() 上,对分组内路由无效。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 需要变量约束 + 分组管理,优先改用分组内定义带参数路由,例如:
Route::get('user/:id', 'User/read')->middleware('auth') - 全局变量自动解析(如根据 token 解出 user_id)建议放在中间件里做,而不是依赖
bind() - 想统一约束某类参数,可用中间件拦截后塞进 Request 对象,控制器里直接
$this->request->param('user_id')
嵌套路由分组不会自动继承外层中间件
ThinkPHP 的分组是扁平结构,不是树状继承。外层 Route::group('admin') 绑了 auth,内层 Route::group('admin/user') 仍是独立节点,中间件不会透传。
- 若需细化控制(比如仅
/admin/user下加角色校验),应在内层分组单独绑定:->middleware(['auth', 'check_role:user']) - 避免三层以上嵌套分组,调试时容易搞不清哪层绑了、哪层漏了
- 更可控的做法:用统一前缀(如所有
/admin/路由都绑auth),权限细化放控制器里用$this->middleware('check_role:user')补充 - 注意:控制器级中间件只在该控制器方法执行时触发,无法替代路由层的前置拦截(比如非法 path 直接 404)
域名绑定分组里中间件怎么配
用 Route::domain('admin', function(){}) 定义的域名分组,中间件绑定方式和普通分组完全一致,但有两点关键限制:
- 必须确保
route_domain_bind配置已开启(TP6 默认关闭),否则整个Route::domain()会被忽略 - 该闭包内定义的所有路由,都只能复用这个分组里绑定的中间件;无法复用全局中间件,也不能跨分组共享中间件实例
- URL 生成时不会自动带域名,
url('admin/index')还是拼当前域名,要加['domain' => 'admin.example.com']手动指定 - 调试时若
APP_DEBUG = false,域名匹配失败会静默 fallback 到默认路由,不容易发现配置问题
实际项目中,最容易被忽略的是「分组定义后没链 middleware()」和「bind() 与 group() 混用导致绑定失效」这两处——它们不会报错,只会让中间件彻底消失。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










