Yii2中URL路径参数(如post/<id:\d+>)会通过反射机制自动注入控制器动作同名参数,无需手动调用request->get();查询参数(如?page=2)则需显式获取。

UrlRule里写的参数怎么在控制器里拿到
路由规则中定义的路径参数(比如 post/<id:></id:>),会自动注入到对应控制器动作的参数列表里,前提是动作方法签名里有同名参数。Yii2 用反射机制匹配参数名,不是靠 $_GET 或 request->get() 手动取。
常见错误是写了规则 'post/<id:>' => 'post/view'</id:>,但 PostController::actionView() 定义成 public function actionView() { ... } —— 没声明 $id 参数,结果拿不到值,$id 为 null 或触发 404。
- 正确写法:动作方法必须带参数,且变量名和规则中占位符一致(区分大小写):
public function actionView($id) { echo $id; } - 参数类型不会自动转换,
$id是字符串,需手动(int)$id或用filter_var($id, FILTER_VALIDATE_INT) - 如果动作参数有默认值(如
actionView($id = null)),而 URL 中没提供该段(比如访问/post/),则走默认值;但规则要求<id:></id:>时,URL 缺失该段会导致匹配失败,压根进不了这个动作 - 多个路径参数同理:
'user/<username:>/posts' => 'user/post/index'</username:>→ 动作必须是public function actionIndex($username) { ... }
查询参数(?page=2)和路径参数混用时怎么区分
路径参数来自 URL 路径结构(如 /user/john/posts 中的 john),查询参数来自 ? 后面的键值对(如 ?page=2&sort=desc)。Yii2 默认把查询参数当 GET 参数处理,不参与 UrlRule 匹配,也不注入动作参数。
所以即使你写了规则 'user/<username>/posts' => 'user/post/index'</username>,访问 /user/john/posts?page=2,$username 能取到 'john',但 page 不会自动变成动作参数,得手动取:
- 用
\Yii::$app->request->get('page')或简写$this->request->get('page') - 不能写成
public function actionIndex($username, $page)—— 这样 Yii 会尝试从路径里找page段,但 URL 里没有,直接报错或跳过规则 - 想统一处理,可在动作里合并:
$page = \Yii::$app->request->get('page', 1);
为什么 $this->request->get('id') 拿不到 UrlRule 里的 id
因为 UrlRule 提取的路径参数根本不在 GET 参数里,它们被框架提前解析并剥离出 URL 路径,然后才进控制器动作。调用 $this->request->get('id') 是查 ?id=123 这种查询参数,和 /post/123 里的 123 是两码事。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
典型误用场景:
- 规则写成
'post/<id:>' => 'post/view'</id:>,但控制器里写$id = $this->request->get('id');→ 永远为null - 规则写成
'post/<id:>' => 'post/view'</id:>,同时又允许/post/view?id=123这种传统方式 → 实际上是两个不同入口,容易逻辑混乱 - 调试时用
var_dump(\Yii::$app->request->get())看不到路径参数,这是正常现象,别怀疑配置
模块嵌套下参数传递要注意什么
模块路径本身不产生额外参数,但会影响路由解析层级。比如规则写在应用级 urlManager,目标路由是 admin/post/view,而 admin 是模块,那么 PostController 在 admin 模块下,它的 actionView($id) 签名仍然有效,$id 依然能拿到路径参数。
容易踩的坑:
- 规则 key 写成
'admin/post/<id:>' => 'admin/post/view'</id:>—— 多余。模块名已由路由前缀承载,UrlRule 只管控制器及之后的部分 - 在模块自己的
UrlManager配置里加规则,但没启用enablePrettyUrl,导致规则不生效 - 动作参数名和模块名冲突(比如模块叫
user,动作参数也叫$user),虽然不报错,但语义易混淆,建议用更具体的名字如$userId或$username
最常被忽略的是:路径参数注入只发生在动作方法参数层面,不进 $_GET、不进 request->get()、也不会出现在 Yii::$app->requestedRoute 字符串里——它被解析后就“消失”了,只留下干净的路由和填充好的参数。别试图在中间件或行为里去“还原”它,直接依赖动作参数最稳。


















