2

我有以下application.config動態加載模塊ZF2

return array(
'modules' => array(

    'Application', 
    'ErrorHandler' 
), 
'module_listener_options' => array(
    'module_paths' => array(
     './module', 
     './vendor' 
    ), 
    'config_glob_paths' => array(
     'config/autoload/{,*.}{global,local}.php' 
    ) 
) 
); 

,並在應用程序/ Module.php我有(小部分功能):

public function onBootstrap(MvcEvent $e) 
{ 
    $eventManager  = $e->getApplication()->getEventManager(); 
    $moduleRouteListener = new ModuleRouteListener(); 
    $moduleRouteListener->attach($eventManager); 

    $this->initModules($e); 
} 

public function getConfig() 
{ 
    return include __DIR__ . '/config/module.config.php'; 
} 

public function getAutoloaderConfig() 
{ 
    return array(
     'Zend\Loader\StandardAutoloader' => array(
      'namespaces' => array(
       __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
      ), 
     ), 
    ); 
} 

private function getModules(MvcEvent $e) { 
    $sm = $e->getApplication()->getServiceManager(); 
    $moduleTable = $sm->get('ModuleTable'); 

    $modules = array(); 

    foreach ($moduleTable->fetchAll() as $m) { 
     $modules[] = $m; 
    } 

    return $modules; 
} 

private function initModules(MvcEvent $e) { 
    $modules = $this->getModules($e); 

    $serviceManager = $e->getApplication()->getServiceManager(); 
    $moduleManager = $serviceManager->get('ModuleManager'); 

    $loadedModules = $moduleManager->getLoadedModules(); 

    foreach ($loadedModules as $module) { 
     $this->loadedModules[] = str_replace('\Module', '', get_class($module)); 
    } 

    foreach ($modules as $module) { 
     try { 
      $moduleManager->loadModule($module->getName()); 
      $this->loadedModules[] = $module->getName(); 
     } catch (\Exception $e) { 
      $this->failedModules[] = $module->getName(); 
     } 
    } 

    if (count($this->failedModules) > 0) { 
     // Error in loading modules 
     exit; 
    } 

    return $this; 
} 

public function getServiceConfig() 
{ 
    return array(
     'factories' => array(
      'ModuleTable' => function($sm) { 
       return new ModuleTable($sm->get('Zend\Db\Adapter\Adapter')); 
      }, 
     ), 
    ); 
} 

什麼,我想在這裏實現的是讓模塊根據數據庫的設置動態加載。

我得到加載模塊沒有錯誤...當我嘗試回撥$ moduleManager-> getLoadedModules();我看到該模塊在加載列表中,但其配置和功能不起作用。具體來說,我有該模塊中的路由,當試圖訪問它們時,我得到了404。但是,如果我將模塊包含在application.config中,所有工作都是完美的。

可能實現?如果是有任何指導方針

由於

UPDATE

我設法模塊:: init()方法內動態加載的模塊...但沒有任何成功訪問的ServiceManager和/或DB訪問來加載從分貝模塊列表...

+0

看看https://github.com/weierophinney/zf2-documentation/blob/71aac39e9ae78eaca3739458c5a2ccf15f4cdb2c/docs/languages/en/tutorials/config.advanced.rst。 操縱合併配置部分可以幫助您與您的問題 – cptnk

+0

我操縱一個小包裹,增加了條件,以模塊加載,我尚未大功告成:https://packagist.org/packages/saeven/zf2-dynamic -modules SL在技術上可用於服務,所以我可以將它推入條件評估程序而不是關閉程序,以便您訪問數據庫。 – Saeven

+0

這有什麼好運?我被困在相同的問題 –

回答

0

這是一個老問題,但我今天看到它試圖做同樣的事情。我的代碼向ZF3面向而是應該在ZF2工作:

https://github.com/basicinvoices/basicinvoices-modulemanager

我遵循的基本...

  1. 等到模塊已經被加載(ModuleEvent :: EVENT_LOAD_MODULES_POST)本我們有辦法訪問數據庫配置。我以高優先級(9000)着迷它,以確保它在其他事件之前運行。
  2. 在這一點上,我加載了一個數據庫適配器。模塊服務尚未分配,所以我們必須手工創建它,但它很容易。我們在數據庫中搜索尚未加載的活動模塊,並使用ModuleManager::loadModule()方法加載它們。我們也把它添加到模塊陣列,並將其設置回ModuleManager
  3. 的配置不合並,並在一定點是偉大的,因爲如果配置已被緩存,如果在模塊中進行改變,我們將有問題數據庫...但它需要一個額外的步驟,我們應該檢查模塊是否有配置,如果有,我們將自己合併到合併的配置中。

...這就是它。

+0

關於你的第3步,我們如何才能在zend'config'服務中將Modules'module.config.php'中的配置值合併! –

+0

該配置似乎不工作:( –