全局pattern规则仅对含:id等占位符的路由生效,须在route.php顶部一次性声明,影响后续所有规则路由;正则不加^$,不作用于正则路由或闭包路由,tp5不支持该方法。

全局 pattern 规则只对路由表达式中带 :id 这类命名占位符的参数生效,且必须在路由注册前统一声明,漏配或写错正则会导致参数放行失控。
全局 pattern 必须在 route.php 顶部一次性注册
ThinkPHP 6.x 的 Route::pattern() 是静态方法,调用后会影响后续所有路由(包括 get/post 等链式注册),但不回溯已注册的路由。它不是“配置项”,而是运行时规则注入。
- 正确写法:
use think\Route; Route::pattern(['id' => '\d+', 'name' => '[a-zA-Z]+']); Route::get('user/:id', 'user/read'); Route::get('article/:name', 'article/show'); - 错误写法:把
Route::pattern()放在某条路由之后,那条路由就完全不受控 - 注意:正则字符串里不要加
^和$,框架会自动包裹;写成'^\d+$'反而匹配失败
pattern 不作用于正则路由或闭包路由
pattern 只约束规则路由(即含 :param 占位符的写法),对纯正则路由(如 Route::rule('^/api/v1/users/(\d+)$', ...))或闭包定义的路由完全无效。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 正则路由需自行在正则中写死校验,例如
'^/user/(\d+)$'中的(\d+)就是硬约束 - 闭包路由(
Route::get('/test', function(){...}))没有参数占位,pattern根本没机会介入 - 混合使用时容易误判:以为
user/:id被pattern管住了,结果又写了条Route::rule('^/user/.*$', ...)绕过校验
5.x 和 6.x 的 pattern 行为差异极大
ThinkPHP 5.x 根本不支持 Route::pattern() 全局设置,你写的任何 pattern 调用都会静默忽略——这不是 bug,是版本缺失特性。
- TP5 中只能靠单条路由的
->pattern(['id'=>'\d+'])链式调用(且仅限rule方法,get/post不支持) - TP6.0.3 及更早版本存在 group 嵌套时
pattern覆盖丢失问题:外层 group 设了['id'=>'\d+'],内层 group 没设,那内层里的:id实际无约束 - 稳妥做法:所有含动态参数的路由,都在最内层显式调用
->pattern(),别依赖继承
pattern 匹配失败时不会报错,而是让参数透传进控制器
这是最容易被忽略的风险点:pattern 失效 ≠ 请求拦截,而是参数原样进入 $_GET 或控制器方法参数,后续全靠业务代码兜底校验。
- 比如
Route::pattern(['id'=>'\d+']),但用户访问/user/abc,TP 会把abc当作字符串传给控制器,不会 404 或抛异常 - 真正起拦截作用的是
url_route_must => true+ 严格路由定义,pattern本身只是“建议性过滤” - 生产环境务必搭配控制器内类型判断(如
is_numeric($id))或验证器二次校验
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










