Yii2: $loadedModules не показывает все модули

Создан модуль "форум" - в точности как написано здесь . Затем создал вложенный модуль "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',
            ],
        ];
    }
}

Также создал невложенный модуль "games" (так же) и прописал в "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"

}

Модули "Игры" и вложенные модули "admin" отсутствуют! Хотя doc говорит:

Свойство $loadedModules хранит список загруженных модулей, включая как прямые дочерние, так и вложенные модули, проиндексированные по именам их классов.

Но я смог получить только модуль "forum", созданный мной. Что я неправильно понимаю?


person Boolean_Type    schedule 18.07.2015    source источник


Ответы (1)


Как говорится в документации:

Свойство $loadedModules хранит список загруженных модулей.

что означает, что он сохраняет модули, загруженные в текущем запросе. Например. если вы находитесь на странице модуля example.com/forum/, она будет содержать app\modules\forum\Module, но если вы находитесь на странице example.com/site, где сайт является именем контроллера, $loadedModules будут содержать только модули, которые установлены в свойстве конфигурации $bootstrap.

Чтобы получить список всех модулей, вызовите Yii::$app->modules. Обратите внимание, что $loadedModules содержит само приложение, поскольку оно расширяет класс Module. Yii::$app->modules содержит все модули из свойства modules конфигурации приложения.

person Tony    schedule 19.07.2015
comment
Спасибо! И я заметил, что $loadedModules будет содержать НЕ ТОЛЬКО модули, которые установлены в свойстве $bootstrap конфигурации. Если вы заметили, на contact странице я также видел app\modules\forum\Module, которого НЕТ в начальной загрузке. Это потому, что в целях эксперимента я вызвал \Yii::$app->getModule('forum'); в представлении contact - поэтому я загрузил через метод getModule() еще один модуль - forum. Добавил \Yii::$app->getModule('forum')->getModule('admin'); - модуль admin теперь есть и в $loadedModules! Такая же ситуация с модулем games. Неожиданное поведение для Yii2-новичка) - person Boolean_Type; 21.07.2015
comment
Да, вы правы, при вызове \Yii::$app->getModule(); модуль появится в $loadedModules - person Tony; 21.07.2015