【问题标题】:Yii2: $loadedModules does not show all modulesYii2: $loadedModules 不显示所有模块
【发布时间】:2015-07-18 22:34:30
【问题描述】:

创建的模块 “论坛” - 与 here 完全一样。然后创建嵌套模块“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"

}

"Games" 和嵌套的"admin" 模块不存在!虽然doc 说:

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

但我只能获得 "forum" 我自己创建的模块。我理解错了什么?

【问题讨论】:

    标签: php yii2 yii-modules


    【解决方案1】:

    如文档所述:

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

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

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

    【讨论】:

    • 谢谢!我注意到,$loadedModules 将包含在$bootstrap 配置属性中设置的不完全是 模块。如果你注意到,在contact 页面我还看到了 app\modules\forum\Module,它不在引导程序中。这是因为出于实验的目的,我在 contact 视图中调用了 \Yii::$app->getModule('forum'); - 因此我通过 getModule() 方法加载 另一个模块 - forum。我添加了\Yii::$app->getModule('forum')->getModule('admin'); - admin 模块现在也出现在$loadedModules 中! games 模块的情况相同。 Yii2 初学者的意外行为)
    • 是的,你是对的,当你调用\Yii::$app->getModule();时,模块会出现在$loadedModules
    猜你喜欢
    • 2021-01-23
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    相关资源
    最近更新 更多