2013-04-25 84 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

相关问题