将动态配置注入配置数组的正确方法

时间:2015-09-19 22:10:21

标签: php zend-framework2

我想知道在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'];
}

1 个答案:

答案 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)
    {}
}

您还可以享受服务延迟加载的额外好处。