ThinkPHP 6+ 路由生效首要条件是 config/app.php 中 'app_route' => true(布尔型),否则框架跳过路由加载;路由必须写在 app/route/app.php(单应用)或 app/{name}/route/app.php(多应用),配合 Route::get() 等语义化方法,并执行 php think route:clear 清缓存。

app_route 必须设为 true,否则路由完全不生效
ThinkPHP 6+ 默认关闭路由解析,config/app.php 里 'app_route' => true 这一行没开,写再多 Route::get() 都是白搭——框架根本不会加载 app/route/app.php。这不是语法错,是开关物理断电。
常见错误现象:php think route:list 输出空列表;浏览器访问定义好的路径返回 404 或直接走默认 URL 解析(如 index.php?s=user/read)。
- 确认值是布尔型
true,不是字符串"true"、数字1或注释掉 - 多应用项目(如
app/admin/)必须单独检查对应子应用的config/app.php,主应用配置不继承 - 改完立刻执行
php think route:clear,否则缓存会掩盖新配置
路由文件必须放在 app/route/app.php,不是 config/route.php
config/route.php 只管全局行为开关(比如 url_html_suffix),不承载任何路由规则;真正写 Route::get() 的地方只有一个:单应用是 app/route/app.php,多应用是 app/{name}/route/app.php。
容易踩的坑:
立即学习“PHP免费学习笔记(深入)”;
- 误把路由规则写进
config/route.php,结果完全不注册 - 文件顶部缺
use think\facade\Route;,导致Route::get()报 “Class not found” - 文件为空或只剩注释,框架可能跳过整个加载流程(至少写一条有效路由)
- 手动
include或require进来——TP6 不认这个,靠启动时约定路径自动读取
用 Route::get() 而不是 Route::rule(),避免 method 模糊引发安全问题
Route::rule('user/<id>', 'User/read')</id> 默认匹配所有 HTTP 方法(method => '*'),POST 请求也能撞进本该只响应 GET 的逻辑,可能绕过 CSRF 防护、触发中间件错位,甚至造成数据误删。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
正确做法是显式声明方法语义:
-
Route::get('user/<id>', 'User/read')</id>—— 仅 GET -
Route::post('user', 'User/create')—— 仅 POST - 要支持多方法,写
Route::match(['GET', 'POST'], 'api/data', ...)
语义化方法自带严格模式,可读性强,也更安全。
命令行查路由必须加 --with-route 参数
执行 php think route:list 时,默认不加载路由规则——这是 ThinkPHP 的设计,不是 bug。不加 --with-route,哪怕 app_route 开了、文件写对了,输出也永远是空的。
其他命令同理:
-
php think route:cache→ 改成php think route:cache --with-route -
php think optimize:route(TP5)→ TP6 已弃用,统一用route:cache
开发中反复验证路由是否生效,这一步漏掉,90% 的“路由不工作”问题就卡在这儿。


















