2015-07-18 85 views
2

创建模块“论坛” - 完全如写here。然后创建嵌套模块“管理员”

//"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" 

}

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

$ loadedModules财产不断加载的模块列表,包括直接儿童和嵌套那些,通过他们的类名索引。

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

回答

3

由于文件说:

$ loadedModules财产不断加载的模块

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

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

+1

谢谢!我注意到,'$ loadedModules'将包含**不完全只有在'$ bootstrap'配置属性中设置的**模块。如果你注意到了,在'contact'页面中,我也看到了_app \ modules \ forum \ Module_,它不在引导程序中。这是因为为了实验的目的,我在'contact'视图中调用了'\ Yii :: $ app-> getModule('forum');'因此我通过getModule()方法加载了**一个模块 - 'forum' 。我添加了'\ Yii :: $ app-> getModule('forum') - > getModule('admin');' - 'admin'模块现在也存在于'$ loadedModules'!与“游戏”模块相同的情况。 Yii2初学者的意外行为) –

+0

是的,当你调用'\ Yii :: $ app-> getModule();'该模块将出现在'$ loadedModules'中 – Tony