Вопрос по php, zend-framework-modules, zend-config, zend-framework2, zend-framework-mvc –  файл, без необходимости доступа к базе данных, кешу или другим услугам заранее.

3

ал этот вопрос также вчера, но этот включает в себя код.

вопрос

Мое приложение имеет несколько модулей и 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);
    }
}
ВопросовМожно ли добиться того, что я пытаюсь?Если это так, что является лучшим способом?Чего мне не хватает в моем коде?

Ваш Ответ

0   ответов

Похожие вопросы