数组式路由配置必须写在app/route.php文件里,5.1版本返回扁平数组,6.0+改为调用route::方法,放错位置或未清缓存均导致路由不生效。

ThinkPHP 数组配置路由写法在哪写
数组式路由配置必须写在 app/route.php 文件里,且只能在该文件中生效(5.1+ 版本)。不是写在控制器、中间件或 config 目录下——放错位置会导致完全不加载,连 404 都不会报,只是默默走默认路由。
常见错误现象:Route::get('test', 'index/test') 写对了但访问 404;检查发现 route.php 文件被误放在 config/route.php 或 route/ 子目录下。
- 5.1 和 6.0+ 均只认
app/route.php这一个入口点 - 该文件需返回一个数组(5.1)或直接调用
Route::方法(6.0+),不能 return null 或 echo - 如果用了多应用模式,每个应用的路由仍要单独写在各自
app/{name}/route.php
ThinkPHP 5.1 的数组路由格式怎么写
5.1 支持纯数组定义路由,本质是批量调用 Route::rule(),但语法更紧凑。它不支持嵌套数组或动态 key,必须是扁平结构。
示例:以下写法合法
return [
'hello/:name' => ['index/hello', ['method' => 'get']],
'user/:id' => ['user/read', ['method' => 'get', 'ext' => 'html']],
];
容易踩的坑:
- 键名是路由表达式(如
hello/:name),不是控制器方法名;值数组第一项才是控制器/操作,格式为'模块/控制器/操作'或'控制器/操作' - 第二个数组元素是可选参数,
method必须小写,ext控制后缀匹配,https要显式写true才强制 - 别漏掉引号——
hello/:name => index/hello是 PHP 语法错误,必须写成字符串
ThinkPHP 6.0+ 还能用数组方式配路由吗
不能。6.0 废弃了全局数组返回机制,app/route.php 变成纯执行脚本,只允许调用 Route:: 系列方法。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
如果你从 5.1 升级上来,直接把原数组内容改成函数调用即可,比如:
// 5.1 的这行:
'hello/:name' => ['index/hello', ['method' => 'get']],
// 6.0+ 要写成:
Route::get('hello/:name', 'index/hello');
关键差异:
-
Route::get()/Route::post()等已隐含 method 限制,无需再传参数数组 - 需要额外配置(如闭包、中间件、跨域)时,得链式调用
->middleware()或->allowCrossDomain() - 6.0+ 不再支持通过数组 key 控制域名绑定,必须用
Route::domain()显式声明
为什么 route.php 里写了却没生效
最常被忽略的是缓存问题:ThinkPHP 默认开启路由缓存,修改 app/route.php 后必须手动清除,否则旧规则一直跑着。
执行命令:
php think route:clear
其他可能原因:
- 调试模式关闭(
APP_DEBUG = false)时,路由缓存强制启用,改完文件也不触发自动更新 - 用了
Route::import()导入外部 PHP 文件,但路径写错或文件未 return 数组 - Apache 没开
mod_rewrite,Nginx 没配try_files,导致请求根本没进框架,自然不走 route.php
复杂点在于:路由是否生效,其实取决于「Web 服务器 → 入口文件 → 路由解析」三层协作,少一环都白配。尤其上线后关了调试模式,很容易卡在第一层就失败,却以为是代码写错了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










