2013-04-25 66 views
4

我工作的一個項目ZF2和我的公共/ index.php文件就像如下:有沒有辦法在本地覆蓋ZF2的application.config.php指令?

<?php 
chdir(dirname(__DIR__)); 
require 'init_autoloader.php'; 
Zend\Mvc\Application::init(require 'config/application.config.php')->run(); 

應用程序初始化過程中使用application.config.php開始,我知道,ZF2提供了很好的方式來覆蓋模塊配置本地通過文件名,如modulename.local.php,但不適用於application.config.php文件。

例如,在application.config.php我有一個module_listener_options鍵像如下:

return array(
    'modules' => array(
    // ... 
    ), 

    'module_listener_options' => array(
     'module_paths' => array(
     // ... 
     ), 

    'config_glob_paths' => array(
     'config/autoload/{,*.}{global,local}.php', 
    ), 

    'config_cache_enabled' => TRUE, 
    'config_cache_key' => 'configuration_cache', 
    'cache_dir' => __DIR__ . '/../data/cache' 
// ... 
) 

所以我想在本地禁用配置緩存在開發環境中工作一段時間,但我想打開它在一個生產環境,不需要部署後的技巧(如編寫自定義的git-hook/bash腳本等)。

另外我有一個APPLICATION_ENVIRONMENT$_ENV變量在所有服務器(開發,產品,測試)我不知道什麼是在ZF2中實現這一點的最佳方法。

我發現了Stephen Rees-Carter's article,是的解決方法這個問題,但我想學習是否有任何其他/更優雅的解決方案,不依賴於作曲家。

回答

4

你可能只是測試你的環境變量在你的應用程序配置,並設置相應的緩存,例如,

<?php 
// application.config.php 
$env = getenv('APPLICATION_ENVIRONMENT'); 
$configCacheEnabled = ($env == 'production'); 

return array(
    //.. 

    'config_cache_enabled' => $configCacheEnabled, 

    //.. 
); 
+0

我認爲這是最簡單的解決方案。謝謝。 – edigu 2013-05-06 15:43:15

+1

另外羅布艾倫寫了一篇關於同樣的問題和類似的方法的博客文章http://akrabat.com/zend-framework-2/caching-your-zf2-merged-configuration/ – edigu 2013-06-27 07:57:46

4

下面是一個例子,只包括你的開發設置模塊,與本地文件覆蓋。 如果您只希望覆蓋本地配置文件,您可以輕鬆地刪除環境變量檢查。

application.config.php

$config = array(
    'modules' => array(
     'Application', 
     'ZfcBase', 
    ), 
    'module_listener_options' => array(
     'config_glob_paths' => array(
      'config/autoload/{,*.}{global,local}.php', 
     ), 
     'module_paths' => array(
      './module', 
      './vendor', 
     ), 
    ), 
); 

if(getenv('APPLICATION_ENV') == 'development' && is_readable('config/autoload/application.config.local.php')){ 
    $localAppConfig = require 'config/autoload/application.config.local.php'; 
    $config = array_merge_recursive($config,$localAppConfig); 
} 

return $config; 

配置/ application.config.local.php

return array(
    'modules' => array(
     'ZendDeveloperTools', 
     'ZFTool' 
    ), 
    /** 
    * Add any overrides to the new local config 
    */ 
); 

然後,您可以再補充覆蓋到本地文件,它可以是不同的舞臺和生產環境。

+0

不會有這個'application.config.local自動載入目錄中的.php'文件意味着它會被合併兩次到配置中? – 2013-05-21 02:05:40

+0

爲什麼要合併兩次?它會被加載一次,加載application.config.php後,所以值覆蓋application.config.php中的值 – Andrew 2013-05-21 07:20:55

+0

您從'application.config.php'手動加載一次,但因爲它以'local .php',它會被'config_glob_paths'模式匹配並再次添加到配置中(一旦所有模塊配置合併)。爲了避免這種副作用,最好將其命名爲「application.config.development.php」。 – 2013-05-22 23:33:30

相關問題