2015-07-18 72 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