ThinkPHP路由传参需用:变量名绑定路径段并配合pattern()正则约束确保安全;支持多级、可选参数;正则路由适用于复杂结构,需注意配置顺序与完全匹配符号$。

ThinkPHP 路由传参和正则约束是保障 URL 安全、语义清晰、控制器逻辑健壮的关键操作。核心在于:用 :变量名 传递动态参数,再通过 pattern() 或正则路由显式限定其格式,避免非法值进入业务层。
动态参数怎么传:用 : 占位符绑定 URL 路径段
ThinkPHP 支持在路由规则中使用冒号开头的变量占位符,自动提取对应路径段并作为参数传入控制器。
-
Route::get('user/:id', 'index/user');→ 访问/user/123时,:id值为123,控制器中可用input('id')或方法参数public function user($id)直接接收 - 支持多级变量:
Route::get('article/:year/:month/:day', 'index/article/date');→/article/2025/10/27会传入三个参数 - 可选参数用方括号:
Route::get('list/[:page]', 'index/list');→/list和/list/2都匹配,:page在未提供时为null
为什么必须加正则约束:防误匹配与安全兜底
不加约束的 :id 默认匹配任意非斜杠字符(如字母、符号、空格),可能引发类型错误、SQL 注入或路由冲突。例如 /user/abc 本该 404,却错误进入用户查询逻辑。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 推荐统一用
pattern()方法限制:Route::get('user/:id', 'index/user')->pattern(['id' => '\d+']);→ 只接受纯数字,/user/123✅,/user/abc❌(直接 404) - 支持常见格式:
'id' => '[a-zA-Z0-9_]{3,16}'(用户名)'slug' => '[a-z0-9\-]+'(SEO 友好路径)'token' => '[\w]{32}'(固定长度令牌) - 多个参数可批量约束:
->pattern(['id' => '\d+', 'status' => '[01]'])
正则路由写法:适合复杂结构或需捕获子模式的场景
当路径规则无法用简单占位符描述(比如带年月日前缀、混合字母数字分隔),可用原生正则表达式定义,并用 :1、:2 引用捕获组。
立即学习“PHP免费学习笔记(深入)”;
- 语法以
/^开头、$/结尾:Route::get('/^user\/(\d{4})\/(\w{2})$/', 'index/user/detail?year=:1&code=:2'); - 访问
/user/2025/AB→ 自动解析出year=2025、code=AB,拼接到目标地址 - 注意:正则中必须用反斜杠转义斜杠,且子模式序号从左到右依次为 :1、:2……
实际配置位置与优先级提醒
路由规则统一写在 route/route.php 中(TP6)或 Conf/config.php 的 URL_ROUTE_RULES 数组里(TP3/5)。顺序很重要:
- 越具体的规则越靠前,比如先写
'user/:id\d'(强制数字),再写'user/:name'(泛匹配),否则后者会提前截获所有请求 - 结尾加
$表示完全匹配:'user/:id\d$'拒绝/user/123/extra这类多余路径段 - 建议对所有含变量的路由都加 pattern 约束,不依赖控制器内二次校验


















