2

创建模块“论坛” - 完全按照此处所写。然后创建嵌套模块“admin”

//"Module.php" in '@app/modules/forum'
namespace app\modules\forum;

class Module extends \yii\base\Module {
    public function init() {
        parent::init();
        \Yii::configure($this, require(__DIR__ . '/config.php'));

        $this->modules = [
            'admin' => [
                // here is my nested module
                'class' => 'app\modules\forum\modules\admin\Module',
            ],
        ];
    }
}

还创建了一个非嵌套模块“游戏”(以相同的方式)并在“web.php”(主配置文件)中写入:

'modules' => [
    'forum' => [
        'class' => 'app\modules\forum\Module',
    ],
    'games' => [
        'class' => 'app\modules\games\Module',
    ],
    'admin' => [
        'class' => 'app\modules\forum\modules\admin\Module',
    ],
],

但是当我尝试输出时:

// codeline is written in application view, not in module view
var_dump(array_keys(\Yii::$app->loadedModules));

我只看到了这些模块:

array(4) {
  string(19) "yii\web\Application"
  string(16) "yii\debug\Module"
  string(14) "yii\gii\Module"
  string(24) "app\modules\forum\Module"

}

“游戏”和嵌套的“管理”模块不存在!虽然医生说:

$loadedModules 属性保存加载模块的列表,包括直接子模块和嵌套模块,由它们的类名索引。

但我只能得到“论坛”自己创建的模块。我理解错了什么?

4

1 回答 1

4

正如文件所说:

$loadedModules 属性保存已加载模块的列表

这意味着它会保留在当前请求中加载的模块。例如,如果您在模块的页面上example.com/forum/,它将包含app\modules\forum\Module但如果您在example.com/site站点控制器的名称上,则将仅包含在配置属性$loadedModules中设置的模块。$bootstrap

要获取所有模块的列表,请调用Yii::$app->modules. 请注意,它$loadedModules包含应用程序本身,因为它扩展了Module类。Yii::$app->modules包含来自应用配置modules属性的所有模块。

于 2015-07-19T06:02:28.553 回答