对于应用程序,我想创建某种设置步骤。在其中一个步骤中,数据库配置将写入应用程序.ini文件。这一切都有效,但是发生了一些非常奇怪的事情:目录的所有路径(库,布局等)都从带有APPLICATION_PATH的路径更改。到完整路径。可以想象,这不是很系统友好。知道我该如何防止这种情况吗?
我使用以下代码更新应用程序.ini:
# read existing configuration
$config = new Zend_Config_Ini(
$location,
null,
array('skipExtends' => true,
'allowModifications' => true));
# add new values
$config->production->doctrine->connection = array();
$config->production->doctrine->connection->host = $data['server'];
$config->production->doctrine->connection->user = $data['username'];
$config->production->doctrine->connection->password = $data['password'];
$config->production->doctrine->connection->database = $data['database'];
# write new configuration
$writer = new Zend_Config_Writer_Ini(
array(
'config' => $config,
'filename' => $location));
$writer->write();
> 由于 Zend_Config_Ini 使用默认的 ini 扫描模式 (INI_SCANNER_NORMAL),它将解析所有选项并将常量替换为它们各自的值。您可以做的是使用 INI_SCANNER_RAW 模式直接调用parse_ini_file,这样就不会解析选项。
即使用
$config = parse_ini_file('/path/to/your.ini', TRUE, INI_SCANNER_RAW);
您将获得一个关联数组,您可以根据需要进行操作,然后您可以使用以下代码片段(来自注释)将其写回:
function write_ini_file($assoc_arr, $path, $has_sections=FALSE) {
$content = "";
if ($has_sections) {
foreach ($assoc_arr as $key=>$elem) {
$content .= "[".$key."]n";
foreach ($elem as $key2=>$elem2) {
if(is_array($elem2))
{
for($i=0;$i<count($elem2);$i++)
{
$content .= $key2."[] = ".$elem2[$i]."n";
}
}
else if($elem2=="") $content .= $key2." = n";
else $content .= $key2." = ".$elem2."n";
}
}
}
else {
foreach ($assoc_arr as $key=>$elem) {
if(is_array($elem))
{
for($i=0;$i<count($elem);$i++)
{
$content .= $key2."[] = ".$elem[$i]."n";
}
}
else if($elem=="") $content .= $key2." = n";
else $content .= $key2." = ".$elem."n";
}
}
if (!$handle = fopen($path, 'w')) {
return false;
}
if (!fwrite($handle, $content)) {
return false;
}
fclose($handle);
return true;
}
即用:
write_ini_file($config, '/path/to/your.ini', TRUE);
操作$config数组后。只需确保在需要时为选项值添加双引号...
或者 - 而不是使用该函数 - 您可以尝试使用 Zend_Config_Writer_Ini 将其写回,在将数组转换回 Zend_Config 对象后,我想这也应该有效......
我想您可以遍历这些值,检查 APPLICATION_PATH
值之间的匹配,并将其替换为字符串文字APPLICATION_PATH
。
也就是说,如果您知道APPLICATION_PATH
包含字符串'/home/david/apps/myapp/application'
并且您找到一个配置值'/home/david/apps/myapp/application/views/helpers'
,那么您会用字符串'APPLICATION_PATH'
对前导字符串'/home/david/apps/myapp/application'
进行某种替换,最终得到'APPLICATION_PATH "/views/helpers"'
。
有点笨拙,但这样的事情可能会起作用。
很长的机会 - 但是您是否尝试过在未定义APPLICATION_PATH
常量的情况下运行Zend_Config_Writer_Ini
代码?它应该将其解释为文字字符串"APPLICATION_PATH",并且可能有效。