ThinkPHP 6 路由默认仅加载 route/app.php 文件,它不是配置文件而是可执行的路由注册逻辑;多文件需通过 Route::import() 手动引入,且须清除路由缓存生效。

ThinkPHP 路由配置文件默认在哪?
ThinkPHP 6 默认不提供集中式路由配置文件,route/app.php 是唯一被框架自动加载的 PHP 路由定义文件——它不是“配置”,而是可执行的路由注册逻辑。很多开发者误以为像 Laravel 那样有 routes/web.php + routes/api.php 的多文件结构,其实 TP6 原生只认这一个入口。
常见错误现象:Route::import() 失败、自定义 routes/ 目录下文件完全不生效、php think route:list 看不到新路由。
- 所有路由定义必须最终汇入
route/app.php,否则框架启动时不会加载 - 该文件返回的是
think\Route实例,不能直接写纯数组或 JSON - 如果用
Route::import('xxx.php'),目标文件也必须返回合法的路由定义数组(键为规则、值为闭包/控制器)
怎么实现多文件路由拆分?
靠 Route::import() 手动聚合,而不是依赖自动扫描。这是最轻量且兼容性最好的方式,避免改核心加载逻辑或引入额外包。
使用场景:中大型项目需按模块(如 admin、api/v1、wechat)隔离路由定义;团队协作时避免多人同时修改 app.php 冲突。
立即学习“PHP免费学习笔记(深入)”;
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 在
route/下新建admin.php、api_v1.php等文件,每个返回关联数组:return [ 'admin/login' => 'admin/LoginController@login', 'admin/logout' => ['route'=>['method'=>'POST'], 'do'=>'admin/LoginController@logout'] ]; - 在
route/app.php中按需导入:Route::import('admin.php');、Route::import('api_v1.php'); - 注意路径是相对于
route/目录的,不加route/前缀,也不写扩展名(TP 自动补 .php)
为什么不能用 config/route.php 或环境变量控制路由?
ThinkPHP 的路由系统在应用初始化早期就完成注册,而配置文件(config/route.php)是在容器构建后才加载的——此时路由已锁定,再改配置项无效。试图把路由规则塞进配置里,本质是混淆了「声明式定义」和「运行时配置」。
性能影响:若强行在 config/route.php 里 return 一大段路由数组,再在 app.php 中读取并调用 Route::rule() 逐条注册,会显著拖慢请求启动时间,尤其在 debug 模式下反复解析。
-
config/route.php存在但无实际作用,框架从不读它 - 环境变量(如
APP_ENV=testing)只能用来开关中间件或日志,不能动态切换路由文件 - 真正可控的开关只有 PHP 条件判断:
if (env('APP_DEBUG')) { Route::import('debug_routes.php'); }
路由文件改动后不生效?缓存和命名冲突是主因
ThinkPHP 默认开启路由缓存,修改 route/app.php 或其 import 的任何文件后,必须手动清除缓存,否则旧规则一直生效。
容易踩的坑:Route::import('v1.php') 和 Route::import('V1.php') 在 Windows 下可能被当成同一文件,但在 Linux 服务器上就是两个不同文件,导致部分路由漏载。
- 清缓存命令:
php think route:clear(不是cache:clear) - 确保所有 import 的文件名全小写、无空格、不含中文
- 检查文件权限:web 进程用户必须有读取
route/下所有 .php 文件的权限,否则 import 静默失败
Route::get() 都是实时调用,不是声明后由某处统一解析。这意味着拆分文件只是组织手段,最终仍要落到一次完整的 PHP 执行上下文中——漏掉一个 import,那部分路由就彻底不存在。


















