使用 APPLICATION_PATH 在 Zend Framework 中编写配置



对于应用程序,我想创建某种设置步骤。在其中一个步骤中,数据库配置将写入应用程序.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",并且可能有效。

相关内容

  • 没有找到相关文章

最新更新