2015-09-19 96 views
2

我想知道什麼是最好的方式注入動態配置(從數據庫中檢索)到Zend Framework 2配置數組?在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

想有一個在文檔中部分,介紹how to manipulate the merged configuration using the specific event ModuleEvent::EVENT_MERGE_CONFIG

Zend\ModuleManager\Listener\ConfigListener觸發特殊事件,Zend\ModuleManager\ModuleEvent::EVENT_MERGE_CONFIG,合併所有配置後,但被傳遞到在它之前 服務經理。通過聆聽此事件,您可以檢查合併的配置並對其進行處理。

問題在於服務管理器在此時不可用,因爲偵聽器的事件是模塊管理器以優先級1000觸發的第一個事件之一)。

這意味着你不能執行查詢和配置之前合併,被傳遞到服務管理的配置,你需要那麼做。

也許我誤解了你的要求,但我會以不同的方式處理。

您可以將您需要配置$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) 
    {} 
} 

你也有額外的好處,該服務是延遲加載。

+0

我按照你的建議創建了DynamicConfig服務工廠。我使用它像$ sm-> get('DynamicConfig'),它看起來不錯。 – Botman

0

我不會用這個approuch,有幾個原因。

  1. 把SQL查詢您的Module.php意味着他們將獲得在執行了這樣每個用戶讓應用程序慢,很慢EVERY請求。

  2. 如果您的數據庫被破壞,所有的配置也將被盜用。

解決方案將移動您的config/autoload/my_custom_config.local.php通過數組與密鑰的所有配置。從那裏你可以隨時加載它而不需要提出一個數據庫請求。它會更快更安全,因爲該文件將位於根文件夾之外,並且黑客入侵服務器總是比黑客竊取數據庫困難得多。

如果你仍然想允許用戶選擇選項,你可以簡單地使用include這個文件在一個動作中,並用foreach顯示它。爲了保存這些信息,你可以這樣做:

file_put_contents("my_custom_config.local.php", '<?php return ' . var_export($config, true).';');

另外一個好處是,如果你加載你的配置discribe你上面的方法也可以retrive的配置就像你通過$sm->get('Config')['dynamic_config']['config3']

+0

如果配置緩存在#1上不成問題。 – akond