我昨天也問了這個問題,但是這個包含代碼。在Zend Framework中動態加載模塊2
問題
我的申請已經多個模塊和2種類型的用戶帳戶,某些模塊被加載always
其存在於application.config.php
它們中的一些conditional
即一些已加載的用戶type A
和一些對於用戶type B
在閱讀關於堆棧溢出的文檔和問題之後,我理解了一些ModuleManager功能並開始實現我可能會工作的邏輯。
一些我怎麼想出一個辦法來加載不存在於application.config.php
[SUCCESS]但其配置不工作[問題]也就是說,如果在onBootstrap
方法我得到ModuleManager
服務並執行模塊getLoadedModules()
我得到正確加載的所有模塊的列表。之後,如果我嘗試從該動態加載的模塊獲取某些服務,則會引發異常。
的Zend \的ServiceManager \的ServiceManager ::得到無法獲取或jobs_mapper創建一個實例
請注意,工廠和所有其他的東西都完全沒有問題,因爲如果我加載模塊從application.config.php它工作正常
同樣,當我試圖從動態加載的模塊,它拋出404 Not Found
其中明確提出,從這些模塊的module.config.php配置不加載甚至訪問任何路線日儘管該模塊由ModuleManager加載。
以我的應用模塊I實施InitProviderInterface
並添加的方法init(ModuleManager $moduleManager)
的Module.php其中I趕上ModuleManager會loadModules.post事件觸發和加載模塊
public function init(\Zend\ModuleManager\ModuleManagerInterface $moduleManager)
{
$eventManager = $moduleManager->getEventManager();
$eventManager->attach(\Zend\ModuleManager\ModuleEvent::EVENT_LOAD_MODULES_POST, [$this, 'onLoadModulesPost']);
}
然後,在相同的類我delcare方法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);
}
}
Questi ons
- 是否有可能實現我所嘗試的?
- 如果是這樣,最好的方法是什麼?
- 我在代碼中缺少什麼?
您會概述_why_您是否重發過兩次相同的問題?上一個問題沒有讓你滿意嗎?我很欣賞你已經承認你已經這樣做了,但總的來說,這是最好的避免,因爲它爲志願者創造了工作。 – halfer