ThinkPHP6路由分组失败主因是闭包未包裹子路由、前缀含多余斜杠、命名空间未显式指定、定义位置错误或权限不足;须在route/app.php中用闭包定义,前缀不加斜杠,资源路由需设namespace或用完整类名,并清缓存。

ThinkPHP6 路由分组配置失败,通常不是语法写错,而是几个关键环节没对上——闭包没包住、前缀拼错了、命名空间没跟上,或者根本就没执行到那里。
闭包必须包裹子路由,不能链式调用
Route::group 返回的是 RuleGroup 对象,不支持 get()、resource() 这类方法链式调用。写成这样肯定无效:
- 错误:Route::group('api')->get('users', 'Api/User@index');
- 正确:Route::group('api', function () { Route::get('users', 'Api/User@index'); });
如果在控制器、中间件或命令行里调用 Route::group,也完全无效——路由定义只能在 route/app.php 或应用专属的 route/app.php 中执行。
前缀路径要干净,避免双斜杠
ThinkPHP 自动拼接前缀和子路由,加多余斜杠就会生成 //api//users 这类非法路径,直接 404。
立即学习“PHP免费学习笔记(深入)”;
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 推荐:Route::group('api/v1', function () { Route::get('users', ...); });
- 避免:Route::group('/api/v1/', function () { Route::get('/users', ...); });
验证方式很简单:开启调试模式,访问 /route:list,看实际注册的完整 URL 是不是你预期的。
资源路由 + 分组 = 必须显式指定命名空间
Route::group('admin') 只影响 URL 前缀,不会自动把控制器映射到 app/controller/admin/ 下。默认仍去找 app\controller\User,而不是 app\controller\admin\User。
- 修复方式一:Route::group('admin', function () { Route::resource('user', 'User')->namespace('admin'); });
- 修复方式二:Route::group('admin', function () { Route::resource('user', 'admin.User'); });
注意类名大小写必须完全一致,app/controller/Admin/User.php 的类名是 app\controller\Admin\User,不是 admin\User 或 AdminUser。
权限与目录结构别被忽略
多应用模式下,route/ 目录需要手动创建,且 Web 服务器(如 Apache 或 Nginx)运行用户必须有读取权限。曾有项目因 route/ 目录权限为 755(而其他目录是 777),导致所有分组路由静默失效,报“找不到控制器”。
- 确认 route/ 目录存在,且非空
- 检查文件属主是否匹配 PHP 进程用户(如 www-data 或 apache)
- Linux 下可临时试运行:chmod -R 775 route/
配完别忘了清缓存:php think route:clear,否则新分组永远不会生效。


















