Yii2模块路由必须显式声明moduleID/controller/action格式,如'admin/user/index',不能依赖自动映射;规则需按从具体到泛化顺序配置,且模块须预先注册。

模块路由必须显式声明 moduleID/controller/action 格式
Yii2 不会自动把 /admin/user/index 映射到 admin 模块下的 UserController::actionIndex(),除非你在 rules 里写明完整路径。常见错误是只写 'user/index' => 'user/index',结果请求进的是主应用的控制器,而不是模块里的。
正确做法是:规则 value 必须包含模块 ID,例如:
'admin/<controller:\w+>/<action:\w+>' => 'admin/<controller>/<action>', 'admin' => 'admin/default/index',
注意点:
-
admin模块必须已注册在modules配置中,否则 404 - 路径模板中的
<controller:></controller:>是正则捕获,\w+才能匹配带中划线的控制器 ID(如user-profile),用\w或不写 pattern 会失败 - 如果模块有默认控制器和动作,
'admin' => 'admin/default/index'这类静态规则要放在泛化规则前面,否则被admin/<controller>/<action></action></controller>吃掉
Url::to() 生成模块链接时不能省略模块 ID
调用 Url::to(['user/index']) 默认生成的是当前模块(或应用)下的路由,不会自动加前缀。想生成 /admin/user/index,必须显式写出模块名:
Url::to(['admin/user/index']); // 或带参数 Url::to(['admin/user/view', 'id' => 123]);
容易踩的坑:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 在
admin模块内部写['user/index'],期望它自动补admin/—— 不会,Yii2 没有“相对模块路由”概念 - 用了别名(如
@admin)但没配Yii::setAlias('@admin', 'admin'),Url::to('@admin/user/index')直接报错 - 模块启用了独立配置(如
admin/config/main.php),但urlManager规则只写在主应用配置里,导致模块内Url::to()不走自定义规则
模块内嵌套子模块时,路由规则要分层处理
比如 admin 模块下挂了 rbac 子模块(mdm/admin),访问路径是 /admin/rbac/assignment。这时不能只靠一条通配规则覆盖所有层级。
推荐写法:
[
'admin/rbac/<controller:\w+>/<action:\w+>' => 'admin/rbac/<controller>/<action>',
'admin/<controller:\w+>/<action:\w+>' => 'admin/<controller>/<action>',
]
关键细节:
- 顺序必须从具体到泛化,
admin/rbac/...要在admin/...前面,否则rbac被当成 controller 名匹配进后者 - 子模块的控制器类必须在正确命名空间下,例如
mdm\admin\controllers\AssignmentController,否则即使路由匹配成功,也会抛Class not found - 子模块的
defaultRoute如果设为'assignment',那/admin/rbac会尝试加载AssignmentController::actionIndex(),而非DefaultController
模块路由与 enableStrictParsing 的冲突点
当 'enableStrictParsing' => true 时,所有请求都必须命中 rules 中某条,否则直接 404。这对模块路由很危险——比如你只写了 'admin/<controller>/<action>'</action></controller>,但忘了配 'admin' 或 'admin/<controller>'</controller>,那么 /admin/user 就挂了。
建议:
- 开发期保持
enableStrictParsing => false,让未匹配规则 fallback 到默认解析逻辑(r=xxx形式仍可用) - 上线前开启
enableStrictParsing => true,但必须确保每种合法访问路径都有对应规则,包括:模块根路径、控制器根路径、带参数路径、带查询参数的路径(如/admin/log?level=error) - 测试时重点检查
Url::to()生成的链接是否真能被解析,不要只看生成结果——生成对不代表能访问
urlManager 配置,也不自动感知模块结构,一切依赖显式字符串匹配和严格顺序。写错一条,整块功能就静默失效。


















