使用Zend_Config_Writer添加注释或格式

时间:2012-04-23 23:28:53

标签: php zend-framework zend-config

我一直在玩Zend_Config_Writer,虽然我可以按照自己的意愿去做,但我发现格式化程度有点令人不安:

[production : general]
;
; Production site configuration data.
;

locale                                          = sv_SE
...

变为

[production : general]   
locale                                          = sv_SE
...

我意识到“新”配置是基于Zend_Config对象中保存的值编写的,并且该对象不包含任何注释或平淡行,但这使得新配置非常难以阅读,尤其是对于我的工人。

这可以以某种方式解决吗?我提出的最好的方法是使用具有“级联”继承的不同部分,但这似乎是一个愚蠢的想法

2 个答案:

答案 0 :(得分:0)

正如您所说,Zend_Config_Writer不会呈现任何评论,因为它们不会存储在Zend_Config对象中。根据要渲染的ini文件的结构,您可以使用“级联”,至少可以清除冗余(对我来说它看起来不那么愚蠢,即使在标准application.ini配置文件中也是如此...)。

当然,另一种解决方案可能是使用或创建其他东西来编写你的ini文件,但它可能有点过分。

希望有所帮助,

答案 1 :(得分:0)

经过一些实验后,我已经通过以下方式解决了我的问题,并成功进行了测试。

  1. 将配置拆分为多个文件。在我的情况下,我有一个大的application.ini,几乎包含我的所有配置和一个小版本.ini,其中包含一些特定于版本的数据
  2. 创建所有(在我的情况下为2)Zend_Config_ini对象separetly但在一个上设置allowModification
  3. 使用Zend_Config_Ini-> Merge()功能合并所有配置,然后将其设置为只读
  4. 要更新配置的任何部分,请从该特定ini文件创建新的Zend_Config_ini对象,并将其设置为允许修改和跳过范围
  5. 更新配置并使用Zend_Config_Writer_ini
  6. 写入更改

    示例代码:

    /* Load the config */    
    //Get the application-config and set 'allowModifications' => true
    $config = new Zend_Config_Ini('../application/configs/application.ini',$state, array('allowModifications' => true));
    
    //Get the second config-file
    $configVersion = new Zend_Config_Ini('../application/configs/version.ini');
    
    //Merge both config-files and then set it to read-only
    $config->merge($configVersion);
    $config->setReadOnly();
    
    /* Update a part of the config */
    $configVersion = new Zend_Config_Ini(
            APPLICATION_PATH.'/configs/version.ini',
            null,
            array('skipExtends' => true, 'allowModifications' => true)
        );
    
    //Change some data here
    $configVersion->newData = "Some data";
    
    //Write the updated ini
    $writer = new Zend_Config_Writer_Ini(
            array('config' => $configVersion, 'filename' => 'Path_To_Config_files/version.ini')
        );
        try
        {
            $writer->write();
        }
        catch (Exception $e) {
            //Error handling
        }