Carga de módulos dinámicamente en Zend Framework 2
Ayer también hice esta pregunta, pero esta incluye código.
ProblemaMi aplicación tiene múltiples módulos y 2 tipos de cuentas de usuario, algunos módulos están cargadosalways
que están presentes enapplication.config.php
algunos de ellos sonconditional
es decir, algunos se cargan para el usuariotype A
y algunos para el usuariotype B
Después de pasar por documentaciones y preguntas sobre Stack Overflow, entiendo algunas de las funcionalidades de ModuleManager y comencé a implementar la lógica que podría funcionar.
De alguna manera, descubrí una forma de cargar los módulos que no están presentes enapplication.config.php
[ÉXITO] pero su configuración no funciona[LA CUESTIÓN] es decir, si enonBootstrap
método consigo elModuleManager
servicio y hacergetLoadedModules()
Me sale la lista de todos los módulos cargados correctamente. Luego, si trato de obtener algún servicio de ese módulo cargado dinámicamente, arroja una excepción.
Zend \ ServiceManager \ ServiceManager :: get no pudo recuperar ni crear una instancia para jobs_mapper
Tenga en cuenta que las fábricas y todas las demás cosas están perfectamente bien porque si cargo el módulo desde application.config.php funciona bien
Del mismo modo, cuando intento acceder a cualquier ruta desde el módulo cargado dinámicamente, arroja404 Not Found
lo que dejó en claro que la configuración de module.config.php de estos módulos no se está cargando aunque ModuleManager cargue el módulo.
En Module.php de mi módulo de Aplicación implementéInitProviderInterface
y agregó un métodoinit(ModuleManager $moduleManager)
donde tomo el módulo de activación loadModules.post moduleManager y carga módulos
public function init(\Zend\ModuleManager\ModuleManagerInterface $moduleManager)
{
$eventManager = $moduleManager->getEventManager();
$eventManager->attach(\Zend\ModuleManager\ModuleEvent::EVENT_LOAD_MODULES_POST, [$this, 'onLoadModulesPost']);
}
Luego, en la misma clase, descuido el métodoonLoadModulesPost
y empiezo a cargar mis 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);
}
}
Preguntas¿Es posible lograr lo que estoy intentando?Si es así, ¿cuál es la mejor manera?¿Qué me falta en mi código?