我昨天也问过这个问题,但是这个问题包括代码。
问题
我的应用程序有多个模块和两种类型的用户帐户,加载了一些模块,其中一些模块是always
为用户加载的,application.config.php
一些是为用户conditional
加载的type A
type B
在阅读了有关 Stack Overflow 的文档和问题后,我了解了 ModuleManager 的一些功能,并开始实现我认为可行的逻辑。
我如何想出一种方法来加载application.config.php
[SUCCESS]中不存在但它们的配置不起作用的模块[THE ISSUE]即如果在onBootstrap
方法中我获得了ModuleManager
服务并且getLoadedModules()
我得到了正确加载的所有模块的列表。之后,如果我尝试从该动态加载的模块中获取一些服务,它会引发异常。
Zend\ServiceManager\ServiceManager::get 无法获取或创建 jobs_mapper 的实例
请注意,工厂和所有其他东西都很好,因为如果我从 application.config.php 加载模块,它就可以正常工作
同样,当我尝试从它抛出的动态加载的模块访问任何路由时,404 Not Found
这清楚地表明即使模块由 ModuleManager 加载,这些模块的 module.config.php 中的配置也没有加载。
代码
在我的应用程序模块的 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);
}
}
问题
- 是否有可能实现我正在尝试的目标?
- 如果是这样,最好的方法是什么?
- 我的代码中缺少什么?