Carregando módulos dinamicamente no Zend Framework 2

Também fiz essa pergunta ontem, mas esta inclui código.

Questão

Meu 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.

Código

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?

questionAnswers(2)

yourAnswerToTheQuestion