ThinkPHP 6.0 路由需满足四个前提:路由文件必须置于 route/app.php(单应用)或 app/{name}/route/app.php(多应用),开头必须 use think\facade\Route;config/app.php 中 'app_route' => true 必须为布尔型 true;命令行需加 --with-route 参数,且修改后须执行 php think route:clear 清缓存。

ThinkPHP 6.0 的路由不是“配了就能用”,而是需要理解它的执行顺序、配置层级和匹配逻辑。配错一处,比如忘了引入门面、没开强制路由、参数名不一致,就可能 404 或报错。下面直说关键点,不绕弯。
路由文件在哪?怎么加载?
默认全局路由写在 route/app.php,这是框架自动加载的主路由文件。你也可以新建其他文件(如 admin.php、api.php),只要放在 route/ 目录下,都会被自动扫描加载。
- 多应用模式下,每个应用可自建
app/{name}/route/app.php,应用内路由优先于全局路由 - 必须开头写
use think\facade\Route;,否则所有Route::get()都会报类未找到 - 路由定义不依赖控制器是否存在——先写路由,再写控制器更安全
基础路由怎么写?GET/POST/REST 怎么区分?
最常用的是快捷方法:Route::get()、Route::post()、Route::delete() 等,语义清晰,无需额外参数。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
Route::get('user/:id', 'user/read');→ 匹配/user/123,:id自动传给read($id) -
Route::post('login', 'auth/login');→ 只响应 POST 请求,GET 访问直接 405 -
Route::delete('article/:id', 'article/delete');→ 符合 REST 规范,适合前端 axios/fetch 调用 - 若需支持多种方法,用
Route::rule('xxx', 'yyy', 'GET|POST')
动态参数与可选参数怎么用?
URL 中的变量用 :key 表示,控制器方法参数名必须与之完全一致(大小写敏感)。
立即学习“PHP免费学习笔记(深入)”;
-
Route::get('blog/:year/:month', 'blog/archive');→ 对应archive($year, $month) -
Route::get('search[/:keyword]', 'search/index');→/search和/search/php都能匹配 - 正则约束加在参数后:
Route::get('user/:id\d+', 'user/info');→:id必须是数字 - 多个可选段可嵌套:
'user[/:id[/:name]]',但建议拆成多个路由更清晰
强制路由、MISS 页面和分组怎么配?
生产环境强烈建议开启强制路由,防止 URL 暴露控制器路径,也避免非法访问。
- 在
config/route.php中设'url_route_must' => true,此时所有请求都必须命中路由规则 - 首页必须显式定义:
Route::get('/', 'index/index');,否则打开根域名直接 404 - 全局未匹配处理:
Route::miss(function() { return view('404'); }); - 路由分组简化前缀:
Route::group('api/v1', function () { Route::get('user', 'api.user/list'); });→ 实际访问/api/v1/user


















