2

내가 application.config동적으로

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 내가 (기능의 몇 가지)가 ZF2 모듈을로드 :

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

는 동적으로 모듈 : 초기화() 메소드 내에서로드 된 모듈을 얻을 수 있었다 ...하지만, 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은 기술적으로 서비스에서 사용할 수 있으므로 DB에 액세스 할 수 있도록 클로저 대신 조건 계산자로 밀어 넣을 수 있습니다. – Saeven

+0

행운이 있나요? –

답변

0

이것은 오래된 질문이지만, 나는 똑같은 일을하려고 오늘 그것을 보았다. 내 코드는 ZF3 위해 개발되었지만 ZF2에 작동합니다 :

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

나는 다음 한 기본 사항은 ...

  1. 기다립니다 모듈이로드 될 때까지 (ModuleEvent :: EVENT_LOAD_MODULES_POST)이 우리는 데이터베이스 구성에 액세스 할 수 있습니다. 다른 이벤트보다 먼저 실행되도록 hight priority (9000)로 연결했습니다.
  2. 이 시점에서 데이터베이스 어댑터를로드합니다. 모듈 서비스는 아직 할당되지 않았으므로 우리는 손으로 작성해야하지만 쉽습니다. 아직로드되지 않은 활성 모듈을 데이터베이스에서 검색하고 ModuleManager::loadModule() 메소드로로드합니다. 또한 모듈 배열에 추가하고 다시 배열로 설정하고 다시 배열로 설정합니다. ModuleManager
  3. 구성이 병합되지 않고 구성이 캐시 된 것처럼 일정한 지점까지 모듈이 변경된 경우 문제가 발생합니다 데이터베이스 ...하지만 추가 단계가 필요합니다, 우리는 모듈이 config를 가지고 있는지 확인해야합니다. 만약 그렇다면 우리는 병합 된 설정으로 그것을 merge합니다.

... 그게 전부입니다.

+0

3 단계에서, zend'config' 서비스에서 모듈'module.config.php'의 설정 값을 어떻게 병합 할 수 있습니까? –

+0

구성이 작동하지 않는 것으로 보입니다. ( –