ThinkPHP 8.1.0 已修复数组路由配置异常,需升级至该版本、清除 runtime/cache/route.php 缓存,并改用 Route::rules() 或链式定义替代旧版数组写法,否则 route:list 将显示空列表或报错。

ThinkPHP 8.1.0 正式发布后,大量开发者反馈在使用数组方式定义路由时出现 Fatal error 或空路由列表问题,根本原因是框架早期对多维数组键名解析存在边界判断缺失,导致 route:import 或 Route::rule() 解析嵌套数组时提前终止或跳过子项。
确认是否受数组路由异常影响
执行终端命令:php think route:list,若输出中完全不显示你写在 app/route/app.php 里的数组路由(例如 ['user' => ['index' => 'user.index', 'create' => 'user.create']]),但字符串路由正常出现,则已触发该异常。
打开 app/route/app.php,检查是否存在类似写法:Route::rule([ 'admin/login' => 'admin.Login/index', 'admin/logout' => 'admin.Login/logout' ])——这种写法在 8.0.x 中会静默失败,【8.1.0 才真正支持原生数组批量注册】。
升级后立即修复数组路由配置
第一步:确认当前版本为 8.1.0 或更高。运行 composer show topthink/think,输出必须包含 8.1.0 字样;若为 8.0.x,请先执行 composer update topthink/think。
立即学习“PHP免费学习笔记(深入)”;
第二步:删除 runtime/cache/route.php 文件。该缓存文件由旧版生成,结构与新版不兼容,不清除会导致数组路由始终无法加载。
第三步:将原数组路由写法统一改为新规范。旧写法:Route::rule(['user/:id' => 'User/read']); → 新写法:Route::rule('user/:id', 'User/read'); 或批量用 Route::rules([...]); 方法。
正确使用数组批量注册路由
方法一:使用 Route::rules() 显式批量导入(推荐)
在 app/route/app.php 中写入:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
Route::rules([<br> 'user/:id' => 'User/read',<br> 'post/:id' => 'Post/detail',<br> 'api/user' => ['route' => 'api.User/index', 'method' => 'GET'],<br>]);
注意:此方法仅在 ThinkPHP 8.1.0+ 有效,【8.0.x 调用会报 Call to undefined method】。
方法二:用二维数组 + Route::import() 分离管理
新建 route/v1.php,内容为:
return [<br> 'v1/user/:id' => ['route' => 'api.v1.User/read', 'middleware' => ['cors']],<br> 'v1/posts' => 'api.v1.Post/list',<br>];
然后在 app/route/app.php 末尾添加:Route::import('v1', 'v1');。
绕过数组解析、改用链式定义防兼容风险
若项目需长期稳定且团队成员版本混杂,直接放弃数组写法,改用链式调用:
Route::get('user/:id', 'User/read')->name('user.read');<br>Route::post('user', 'User/create')->name('user.store');<br>Route::put('user/:id', 'User/update')->name('user.update');
每条规则独立解析,不受数组嵌套深度、键名类型(数字/字符串)、空格缩进等干扰,部署时零兼容风险。


















