yii2 的 modules 配置必须写在应用配置文件中:web 应用为 config/web.php 的顶层数组(与 components 同级),console 应用为 config/console.php 的顶层数组;不可写在 components 内或控制器中,否则模块无法加载。

modules 配置写在哪儿?
Yii2 的 modules 必须写在应用配置数组里,具体位置取决于你用的是 Web 应用还是 Console 应用:
Web 应用是 config/web.php 里的 components 同级键;Console 应用则是 config/console.php 的同级位置。不是写在 components 里面,也不是写在控制器里——写错位置会导致模块完全不加载。
基础写法:字符串、数组、类名三种形式
模块注册支持三种语法,对应不同需求:
- 简写(推荐用于默认配置):
'admin' => 'app\modules\admin\AdminModule'—— 只指定类名,Yii 自动 new 实例,用默认构造参数 - 完整数组(需要自定义属性时必用):
'api' => ['class' => 'app\modules\api\ApiModule', 'version' => 'v2', 'debug' => true]—— 所有 public 属性都可在这里赋值 - 匿名函数(极少数需运行时判断的场景):
'logger' => function() { return new app\modules\logger\LoggerModule(Yii::$app->id); }—— 注意:每次访问该模块都会重新执行函数,慎用
子模块嵌套和 URL 路由怎么配?
Yii2 原生不支持多级模块嵌套(比如 admin/user/profile 这种路径),admin 是模块,user 和 profile 只能是控制器或动作。要实现类似效果,得靠路由规则或模块内再挂子模块:
- 模块内启用子模块:在
AdminModule::init()里手动调用$this->setModules([...]) - URL 映射:在
urlManager的rules中加一条'admin/<controller:>/<action:>' => 'admin/<controller>/<action>'</action></controller></action:></controller:> - 别名冲突:如果两个模块都注册了同名控制器(如
SiteController),后注册的会覆盖前一个,没报错但行为异常
常见报错和调试要点
模块配置出问题,最常遇到的是 404 或 Invalid Configuration – yii\base\InvalidConfigException:
-
Class 'app\modules\admin\AdminModule' not found:检查命名空间是否拼错、文件路径是否为@app/modules/admin/AdminModule.php、是否漏了use或autoload配置 - 访问
/admin报 404:确认模块类里controllerNamespace指向正确(如'app\modules\admin\controllers'),且该目录下有DefaultController.php - 模块里用
Yii::$app->user报错:说明模块类没继承yii\base\Module,或者继承了但没调parent::init() - 配置中用了
null或空字符串当模块值(如'debug' => ''):Yii 会跳过该模块注册,静默失败
模块的初始化顺序依赖注册顺序,复杂项目里建议把核心模块(如 user、rbac)放在配置数组前面,避免依赖未就绪。











