ThinkPHP8路由分组必须用闭包包裹子路由、控制器路径带完整命名空间、中间件需链式调用且不继承嵌套、pattern/ext须写在分组末尾、allowCrossDomain必须明确域名。

将ThinkPHP6项目升级到ThinkPHP8后,路由分组写法表面相似但底层逻辑和约束条件已发生实质性变化,直接沿用TP6代码会导致路由不生效、中间件失效或类加载失败。
分组定义语法必须带闭包
第一步:打开route/app.php,定位到HTTP路由区块(不是console或event区块)。
第二步:用Route::group()包裹子路由,且【必须传入闭包,不能省略括号或写成链式调用】——Route::group('api')→get()在TP8中是无效语法,会直接报错。
第三步:闭包内控制器路径需带完整命名空间,例如'api/User@index'而非'User@index',否则TP8容器无法解析类名,抛出ClassNotFoundException。
立即学习“PHP免费学习笔记(深入)”;
中间件绑定方式彻底重构
方法一:在分组闭包后链式调用->middleware(),传入类名数组:->middleware([\App\Middleware\Auth::class, \think\middleware\AllowCrossDomain::class])。
方法二:若使用限流等带参数的中间件,可传字符串'throttle:60,1',但仅限框架内置中间件类型;自定义中间件必须用类名。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
【嵌套分组不会自动继承外层中间件】——比如Route::group('admin')->group('user')里的user分组,不显式绑定->middleware()就不会执行鉴权,这点和TP6的隐式继承完全不同。
变量约束与URL后缀必须写在分组末尾
① 统一限制所有含:id的路由只匹配数字:->pattern(['id' => '\d+'])。
② 所有该分组下的URL自动识别.json后缀:->ext('json'),访问/api/v1/users.json即可触发对应路由。
③ 若想避免前缀拼接产生双斜杠(如api//users),可用->prefix('api/v1/')替代分组名,此时分组名设为空字符串:Route::group('', function () { })->prefix('api/v1/')。
【pattern和ext必须写在分组定义末尾,放在闭包内部或漏掉括号都会失效】——TP6允许在闭包里调用Route::pattern(),TP8只认链式调用的末尾位置。
跨域配置必须明确指定域名
在分组末尾链式调用->allowCrossDomain(),传入域名白名单和凭证开关,例如:})->allowCrossDomain(['https://admin.example.com'], true)。
【若传true却用*通配域名,浏览器将拒绝请求】——必须明确列出前端所在域名,不能偷懒写['*'],TP6时代那种宽松写法在TP8中直接失效。


















