3

我目前正在 Phing 中开发一个构建系统,该系统采用 Zend Framework 项目模板并根据 Phing 参数对其进行配置。我遇到的一个问题是在使用 Zend_Config_Writer_Ini 时。

我的 Phing 任务从 repo 中获取一个名为 application.default.ini 的预填充文件,并使用 Zend_Config_Ini 对其进行修改,以从构建文件中添加参数(数据库详细信息等)。然后将其写入 application.ini 以供项目使用。相关任务代码的简化版本如下所示:

$appConfig = new Zend_Config_Ini(
    $appDefaultConfigPath, 
    null, 
    array(
        'skipExtends' => true,
        'allowModifications' => true
    )
);

$appConfig->production->resources->db->params->host = $buildProperties->db->host;
$appConfig->production->resources->db->params->username = $buildProperties->db->username;
$appConfig->production->resources->db->params->password = $buildProperties->db->password;
$appConfig->production->resources->db->params->dbname = $buildProperties->db->dbname;

$writer = new Zend_Config_Writer_Ini();
$writer->setConfig($appConfig)
       ->setFilename($appConfigPath)
       ->write();

就数据库凭据而言,这可以正常工作,但是当涉及到包含已定义常量的预填充路径时,就会出现问题。例如:

bootstrap.path = APPLICATION_PATH "/Bootstrap.php"

变成:

bootstrap.path = "APPLICATION_PATH/Bootstrap.php"

有没有办法在读取/写入不同的 ini 文件时保留这些配置行,或者我应该在运行任务之前重组我的构建文件以复制文件并且只修改我需要更改的 ini 行?

4

4 回答 4

1

当您加载现有配置时,所有常量都已被翻译,即如果您使用 print_r 查看对象,您将不再找到您的常量。因此,使用 writer 打印完整路径而不是常量。

在您的情况下,我猜您的环境中不存在常量,因此按原样打印。

更新:更具体。Zend_Config_Ini::_parseIniFile()用于parse_ini_file()读取将常量作为真实路径加载的 ini 文件。请参阅php.net 文档示例 #2

于 2011-07-12T22:49:02.350 回答
1

直接来自这个php.net 评论

如果 ini 文件中的常量与用单引号引起来的字符串连接,则不会扩展它们,它们必须用双引号括起来才能使常量扩展。

例子:

定义('APP_PATH','/some/path');

mypath = APP_PATH '/config' // 常量不会被扩展:[mypath] => APP_PATH '/config'

mypath = APP_PATH "/config" // 常量将被扩展:[mypath] => /some/path/config

所以你可以用单引号重写你的路径...... bootstrap.path = APPLICATION_PATH '/Bootstrap.php'

...然后APPLICATION_PATH '*'用双引号替换所有出现的 (应该做一个简单的正则表达式)。

于 2011-07-13T07:25:02.560 回答
1

作为替代方案,您可以使用 Phing 的过滤器来替换配置模板中的令牌。

一个示例任务:

<target name="setup-config" description="setup configuration">
    <copy file="application/configs/application.ini.dist" tofile="application/configs/application.ini" overwrite="true">
        <filterchain>
            <replacetokens begintoken="##" endtoken="##">
                <token key="DB_HOSTNAME" value="${db.host}"/>
                <token key="DB_USERNAME" value="${db.user}"/>
                <token key="DB_PASSWORD" value="${db.pass}"/>
                <token key="DB_DATABASE" value="${db.name}"/>
            </replacetokens>
        </filterchain>
    </copy>
</target>

此任务复制application/configs/application.ini.distapplication/configs/application.ini替换标记,例如##DB_HOSTNAME##phing 属性中的值${db.host}

于 2011-07-13T07:40:01.977 回答
0

我想要使​​用 Zend_Config 的便利性,同时保留使用 APPLICATION_PATH 常量的能力,所以我最终在 Zend_Config_Writer 保存文件后用一个简单的正则表达式修复了文件。

$writer->write();

// Zend_Config_Writer messes up the settings that contain APPLICATION_PATH
$content = file_get_contents($filename);

file_put_contents($filename, preg_replace('/"APPLICATION_PATH(.*)/', 'APPLICATION_PATH "$1', $content));
于 2012-09-11T06:30:41.177 回答