Carregando módulos dinamicamente no Zend Framework 2
Também fiz essa pergunta ontem, mas esta inclui código.
QuestãoMeu aplicativo possui vários módulos e 2 tipos de contas de usuário. Alguns módulos são carregadosalways
que estão presentes emapplication.config.php
alguns deles sãoconditional
ou seja, alguns são carregados para o usuáriotype A
e alguns para o usuáriotype B
Depois de passar por documentações e perguntas sobre o estouro de pilha, entendo algumas das funcionalidades do ModuleManager e comecei a implementar a lógica que eu poderia funcionar.
De alguma maneira, descobri uma maneira de carregar os módulos que não estão presentes noapplication.config.php
[SUCESSO] mas a configuração deles não está funcionando[O PROBLEMA] ou seja, se emonBootstrap
método eu recebo oModuleManager
serviço e fazergetLoadedModules()
Eu recebo a lista de todos os módulos carregados corretamente. Depois, se eu tentar obter algum serviço desse módulo carregado dinamicamente, ele lança uma exceção.
O Zend \ ServiceManager \ ServiceManager :: get não pôde buscar ou criar uma instância para jobs_mapper
Observe que as fábricas e todas as outras coisas estão perfeitamente bem porque se eu carregar o módulo em application.config.php, ele funcionará bem
Da mesma forma, quando tento acessar qualquer rota do módulo carregado dinamicamente, ele lança404 Not Found
o que deixou claro que a configuração do module.config.php desses módulos não está carregando, mesmo que o módulo tenha sido carregado pelo ModuleManager.
No Module.php do meu módulo Application, eu implementeiInitProviderInterface
e adicionou um métodoinit(ModuleManager $moduleManager)
onde eu pego o trigger do evento moduleManager loadModules.post e carrego os módulos
public function init(\Zend\ModuleManager\ModuleManagerInterface $moduleManager)
{
$eventManager = $moduleManager->getEventManager();
$eventManager->attach(\Zend\ModuleManager\ModuleEvent::EVENT_LOAD_MODULES_POST, [$this, 'onLoadModulesPost']);
}
Então, na mesma classe, cuido do métodoonLoadModulesPost
e começar a carregar meus módulos dinâmicos
public function onLoadModulesPost(\Zend\ModuleManager\ModuleEvent $event)
{
/* @var $serviceManager \Zend\ServiceManager\ServiceManager */
$serviceManager = $event->getParam('ServiceManager');
$configListener = $event->getConfigListener();
$authentication = $serviceManager->get('zfcuser_auth_service');
if ($authentication->getIdentity())
{
$moduleManager = $event->getTarget();
...
...
$loadedModules = $moduleManager->getModules();
$configListener = $event->getConfigListener();
$configuration = $configListener->getMergedConfig(false);
$modules = $modulesMapper->findAll(['is_agency' => 1, 'is_active' => 1]);
foreach ($modules as $module)
{
if (!array_key_exists($module['module_name'], $loadedModules))
{
$loadedModule = $moduleManager->loadModule($module['module_name']);
//Add modules to the modules array from ModuleManager.php
$loadedModules[] = $module['module_name'];
//Get the loaded module
$module = $moduleManager->getModule($module['module_name']);
//If module is loaded succesfully, merge the configs
if (($loadedModule instanceof ConfigProviderInterface) || (is_callable([$loadedModule, 'getConfig'])))
{
$moduleConfig = $module->getConfig();
$configuration = ArrayUtils::merge($configuration, $moduleConfig);
}
}
}
$moduleManager->setModules($loadedModules);
$configListener->setMergedConfig($configuration);
$event->setConfigListener($configListener);
}
}
QuestõesÉ possível alcançar o que estou tentando?Se sim, qual é a melhor maneira?O que estou faltando no meu código?