tp6伪静态规则需重写:路由必须注册到app/route.php,用route::rule()链式调用pattern()和ext(),正则匹配需拆解为路径变量+约束,后缀需显式声明,多语言需分组定义。

旧版 ThinkPHP 的伪静态规则在 TP6+ 中基本无法直接复用,核心原因是路由解析机制、配置位置和匹配逻辑全部重构。你不能把 TP5 的 config/route.php 里那堆 __pattern__ 和正则数组直接拷过去——TP6 会完全忽略它。
TP5 的 URL_ROUTE_RULES 在 TP6 中彻底失效
TP5 依赖全局配置项 URL_ROUTE_RULES 定义规则,比如:
return [
'__pattern__' => ['id' => '\d+'],
'news/:id' => 'index/news/read',
'/^article_(\d+)$/' => 'index/article/detail?aid=:1',
];
这类写法在 TP6 中不会被加载,因为:
- TP6 不再读取
config/route.php,所有规则必须显式注册到app/route.php(或应用级app/index/route.php) -
__pattern__、__alias__等配置键已被移除,没有等价替代语法 - 正则路由必须用
Route::rule()+pattern()链式调用,且不能混用字符串路径和 query 参数拼接
Route::rule() 与 pattern() 的正确组合方式
TP6 要实现类似 TP5 的正则匹配(如 /^article_(\d+)$/ → index/article/detail?aid=:1),必须拆成两步:
- 用
Route::get()或Route::rule()定义路径结构,比如'article/<aid>'</aid> - 用
pattern()显式约束变量格式,例如->pattern(['aid' => '\d+']) - 不能在路由地址里写
?aid=:1这类 query 拼接,参数自动注入request()->param('aid')
正确示例:
use think\facade\Route;
Route::get('article/<aid>', 'index/article/detail')
->pattern(['aid' => '\d+'])
->name('article_detail');</aid>
访问 /article/123 就能命中,request()->param('aid') 取到 '123';但 /article/abc 直接 404。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
伪静态后缀(如 .html)必须靠 ext() 显式声明
TP5 用 URL_HTML_SUFFIX 全局控制后缀,TP6 改为每个路由单独设置:
- 不加
ext(),/article/123和/article/123.html是两个不同路由 - 要同时支持两者,得注册两条路由,或只留一个并用
ext('html') -
ext('html')后,url('article_detail', ['aid' => 123])生成的链接自动带.html
示例:
Route::get('article/<aid>', 'index/article/detail')
->pattern(['aid' => '\d+'])
->ext('html'); // 仅匹配 /article/123.html</aid>
注意:ext() 不影响实际控制器逻辑,只是 URL 形式和生成规则。
多语言路由前缀需用分组 + 中间件,不能靠配置开关
TP5 可能用 lang 参数或中间件动态切换语言,但 TP6 不再支持 request()->module() 等上下文方法,所以语言识别必须提前做:
- 在全局中间件里解析 URL 前缀(如
/zh-CN/article/123),提取lang并存入think\facade\Lang - 用
Route::group('zh-CN', function () { ... })定义该语言下的所有路由 - 避免在控制器里做语言判断——路由阶段就要确定语言环境,否则 URL 生成(
url())会出错
关键点:TP6 的 url() 函数依赖当前路由标识符(name())和参数,不认语言前缀;所以分组名必须参与路由定义,而不是运行时补。
最易被忽略的是:TP6 的伪静态不是“开启就生效”,而是每条路由都得手动加 ext()、手动配 pattern()、手动设 name(),缺一不可。旧项目迁移时,别想着批量替换配置,得一条一条重写路由定义。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










