ThinkPHP动态路由变量须用{name}语法定义,禁用/:name;控制器方法参数名须与{name}完全一致才能自动注入;格式限制需通过{ id:\d+ }或->pattern(['id'=>'\d+'])显式声明,正则不可含^$。

ThinkPHP 动态路由变量怎么定义
ThinkPHP 的动态路由变量不是靠写死路径,而是用 {name} 占位符配合 Route::rule() 或配置文件声明。关键在于:变量名必须用花括号包裹,且不能含斜杠、点号等非法字符;否则路由匹配直接失败。
常见错误是写成 /user/:id(这是早期 ThinkPHP 3 写法),在 ThinkPHP 6+ 中会完全不生效——新版只认 {id} 这种语法。
-
Route::rule('user/{id}', 'index/user/read'):最基础的单变量写法,{id}会被解析为参数,传给控制器方法 - 多个变量用斜杠分隔:
Route::rule('article/{category}/{id}', 'index/article/detail') - 变量名建议用小写字母+下划线,避免大写或驼峰,否则某些版本可能因大小写敏感导致匹配失败
- 如果变量可选,加问号:
Route::rule('list/{page?}', 'index/article/list'),此时访问/list和/list/2都能命中
ThinkPHP 动态路由变量怎么取值
控制器方法里直接把变量名当参数接收即可,框架自动注入。不需要从 input() 或 param() 手动取——那是处理表单或查询字符串用的。
例如路由定义为 Route::rule('user/{uid}', 'index/user/info'),对应控制器方法就得写成:
public function info($uid)
{
// $uid 已是解析后的值,类型为 string(即使看起来像数字)
}
容易踩的坑:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 参数名必须和路由中
{xxx}完全一致,包括大小写,{Uid}和$uid不匹配 - 如果用了类型提示(如
int $uid),而实际 URL 传的是非数字(如/user/abc),会抛出TypeError,不是静默忽略 - 多个变量顺序必须和路由定义顺序严格一致,不能靠名字自动对齐
ThinkPHP 动态路由变量怎么限制格式
光有 {id} 不够安全,比如你希望 {id} 只接受纯数字,就得加正则约束。ThinkPHP 支持在变量后追加 :regex 规则,或者用数组方式定义更清晰的验证。
- 简单正则写法:
Route::rule('user/{id:\d+}', 'index/user/read'),\d+表示至少一位数字 - 更推荐数组方式,便于扩展:
Route::rule('user/{id}', 'index/user/read', 'GET', ['id' => '\d+']) - 多个变量分别约束:
Route::rule('post/{year}/{month}/{slug}', 'index/post/show', 'GET', ['year' => '\d{4}', 'month' => '\d{1,2}', 'slug' => '[a-z0-9\-]+']) - 注意:正则里不要加
^和$,框架内部已自动锚定,加了反而匹配失败
ThinkPHP 动态路由变量和闭包/中间件怎么配合
动态变量本身不触发中间件,但整个路由规则会走中间件链。如果你在闭包路由里用变量,得手动解构 Request 对象——因为闭包不支持自动参数注入。
- 闭包写法示例:
Route::rule('api/v1/user/{id}', function (\think\Request $request) { $id = $request->route('id'); ... }) - 中间件中获取变量:在
beforeAction或handle()里调用$request->route('id'),别用$request->param('id'),后者是合并所有输入源的,可能被 query string 覆盖 - 如果路由定义了变量但 URL 没提供(比如访问
/user/而不是/user/123),$request->route('id')返回null,需自行判空
变量解析发生在路由匹配阶段,一旦匹配失败,后续控制器、中间件、闭包都不会执行。所以调试时先确认日志里有没有 “Route not found” 类错误,再查变量格式或大小写问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










