Zend框架将开发人员特定的环境信息从配置中分离出来


Zend Framework separating developer-specific environment info from config?

我刚刚开始一个大的Zend框架项目。到目前为止,有一件事让我感到困惑:大部分配置似乎都存储在application/configs/application.ini的单个文件中。该文件包括应用程序功能的各种基本内容,如应用程序名称空间、控制器插件等,以及数据库登录详细信息。我有一些外部承包商,我需要得到这个项目的工作,但我不希望他们有我所有的数据库细节。在Zend中,您如何将环境信息(例如db登录(对于不同的开发人员可能不同)与应用程序配置(对于每个人都是相同的)分开?

我同意这在ZF中比它应该的更困难,希望这是一个将在未来版本中得到改进的领域。

同时,用Zend_Config合并两个配置文件是很容易的,这是你可以利用的优势。如果您打开public/index.php,您将看到底部附近的一个部分,它创建了一个Zend_Application实例。默认情况下,第二个参数是配置文件的完整路径,但是您可以传入一个现有的Zend_Config对象。所以你创建了两个配置对象:application.ini和environment.ini(你喜欢叫什么就叫什么),把它们合并在一起,然后把它传递给Zend_Application:

$config = new Zend_Config_Ini(
    APPLICATION_PATH.'/configs/application.ini', 
    APPLICATION_ENV, 
    array('allowModifications' => true)
);
$environment = new Zend_Config_Ini(
    APPLICATION_PATH.'/configs/environment.ini', 
    APPLICATION_ENV
);
$config->merge($environment);
$application = new Zend_Application(APPLICATION_ENV, $config);
$application->bootstrap()
            ->run();

使用这种方法,您将所有标准内容保留在application.ini中,并将数据库内容移动到environment.ini中。然后将application.ini保存在源代码管理中,将environment.ini添加到gitignore/svn:ignore,并创建一个虚拟的environment.ini.dist,其他开发人员可以使用它来设置他们的本地项目。

注意:如果你因为性能原因在ZF的库文件中注释掉了require_once调用,你可能需要在public/index.php中的一些Zend_Config类中require来让它工作。从错误中可以明显看出这一点。

我为Symfony和Zend做的不是检查配置文件中的信息。

相反,我制作config.dist文件,我保存在SVN/Git中,其中包含运行应用程序所需的所有必要信息,然后为敏感凭据提供虚拟信息。然后在每台机器上(本地开发、生产、登台),我将这个文件复制到真正的cnfig文件名,并使用适当的环境特定细节对其进行编辑。

我这样使用基于php的配置文件(application.php):

<?php
return array_merge_recursive(array(
    'bootstrap' => array(
        'phpSettings' => array(
            'display_startup_errors' => 0,
            'display_errors' => 0
        ),
    'path' => APPLICATION_PATH . '/Bootstrap.php',
        'class' => 'Bootstrap',
    )
    /** all other general config stuff as well **/
), include APPLICATION_PATH . '/configs/' . APPLICATION_ENV . '.php');

和一个特定于环境的(例如development.php):

<?php
return array(
    'phpSettings' => array(
        'display_startup_errors' => 1,
        'display_errors' => 1,
        'error_reporting' => E_ALL,
    ),
    'resources' => array(
        /** log to browser only for development environment **/
        'log' => array(
            'Firebug' => array(
                'writerName' => 'Firebug',
                'filterName' => 'Priority',
                'filterParams' => array(
                    'priority' => Zend_Log::DEBUG
                )
            )
        ),
        'db' => array(
              /** Development Database settings, only need to overwrite the new ones **/
        )
    )
);

从本页偷来的点子(当然你会把development.php放在ignore上)

您可以在application/configs中创建两个ini文件。第一个文件application.ini包含大部分样板配置内容。第二个文件secrets.ini包含您的数据库密码和其他您不想签入源代码控制的内容。现在可以将application.ini文件检入到源代码控制中。不要签入secrets.ini——让VCS忽略它——并强制每个开发人员在他们的个人签出中从头创建该文件。

你可以在你的application/Bootstrap.php类中写一个方法来读取这两个文件,将它们合并成一个Zend_Config对象,并将该对象写入Zend_Registry

我不认为这个解决方案是理想的,但过去它对我很有效。