我想知道在Zend Framework 2中将动态配置(例如从db检索)注入配置数组的最佳方法是什么?在Module.php中我有:
public function onBootstrap(MvcEvent $e) {
$eventManager = $e->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager);
$eventManager->attach('route', array($this, 'mergeDynamicConfig'));
}
public function mergeDynamicConfig(EventInterface $e) {
$application = $e->getApplication();
$sm = $application->getServiceManager();
$configurationTable = $sm->get('DynamicConfiguration\Model\Table\ConfigurationTable');
$dynamicConfig = $configurationTable->fetchAllConfig();
//Configuration array from db
//Array
//(
// [config] => 'Test1',
// [config2] => 'Test2',
// [config3] => 'Test3',
//)
//What to do here?
//I want to use the configurations above like $sm->get('Config')['dynamic_config']['config3'];
}
答案 0 :(得分:0)
文档中有一节解释how to manipulate the merged configuration using the specific event ModuleEvent::EVENT_MERGE_CONFIG
Zend\ModuleManager\Listener\ConfigListener
在合并所有配置之后,但在将其传递给ServiceManager之前触发特殊事件Zend\ModuleManager\ModuleEvent::EVENT_MERGE_CONFIG
。通过侦听此事件,您可以检查合并的配置并对其进行操作。
此问题在于此时服务管理器不可用,因为侦听器的事件是模块管理器在优先级1000处触发的第一个事件之一。
这意味着您无法执行查询并将config before 合并到传递给服务管理器的配置中,您需要在之后执行。
也许我误解了你的要求,但我会采用不同的方法。
您可以使用$serviceManager->get('config')
替换任何需要配置$serviceManager->get('MyApplicationConfig');
的调用,这将是您自己的配置服务,它使用合并的应用程序配置然后添加到它。
例如,您可以在module.config.php
。
return [
'service_manager' => [
'factories' => [
'MyApplicationConfig' => 'MyApplicationConfig\Factory\MyApplicationConfigFactory',
]
],
];
创建一个工厂来加载合并模块配置,进行任何数据库调用或缓存等。
class MyApplicationConfigFactory implements FactoryInterface
{
public function createService(ServiceLocatorInterface $sm)
{
$config = $sm->get('config');
$dbConfig = $this->getDatabaseConfigAsArray($sm);
return array_replace_recursive($config, $dbConfig);
}
protected function getDatabaseConfigAsArray(ServiceLocatorInterface $sm)
{}
}
您还可以享受服务延迟加载的额外好处。