файл, без необходимости доступа к базе данных, кешу или другим услугам заранее.
ал этот вопрос также вчера, но этот включает в себя код.
вопросМое приложение имеет несколько модулей и 2 типа учетных записей пользователей, некоторые модули загруженыalways
которые присутствуют вapplication.config.php
некоторые из нихconditional
то есть некоторые загружаются для пользователяtype A
а некоторые для пользователяtype B
Изучив документацию и вопросы о переполнении стека, я понял некоторые функциональные возможности ModuleManager и начал реализовывать логику, которая, как мне кажется, могла бы работать.
Как-то я разобрался, как загрузить модули, которых нет вapplication.config.php
[УСПЕХА] но их конфигурация не работает[ПРОБЛЕМА] т.е. если вonBootstrap
метод я получаюModuleManager
обслуживать и делатьgetLoadedModules()
Я получаю список всех модулей, правильно загруженных. Впоследствии, если я пытаюсь получить какой-либо сервис из этого динамически загружаемого модуля, он выдает исключение.
Zend \ ServiceManager \ ServiceManager :: get не удалось получить или создать экземпляр для jobs_mapper
Обратите внимание, что фабрики и все остальное прекрасно, потому что, если я загружаю модуль из application.config.php, он работает нормально
Точно так же, когда я пытаюсь получить доступ к любому маршруту из динамически загруженного модуля, он выдает404 Not Found
что дало понять, что конфигурация из module.config.php этих модулей не загружается, даже если модуль загружен ModuleManager.
В Module.php моего модуля приложения я реализовалInitProviderInterface
и добавил методinit(ModuleManager $moduleManager)
где я ловлю триггер события moduleManager loadModules.post и загружаю модули
public function init(\Zend\ModuleManager\ModuleManagerInterface $moduleManager)
{
$eventManager = $moduleManager->getEventManager();
$eventManager->attach(\Zend\ModuleManager\ModuleEvent::EVENT_LOAD_MODULES_POST, [$this, 'onLoadModulesPost']);
}
Затем в том же классе я делаю методonLoadModulesPost
и начать загрузку моих динамических модулей
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);
}
}
ВопросовМожно ли добиться того, что я пытаюсь?Если это так, что является лучшим способом?Чего мне не хватает в моем коде?