使用APPLICATION_PATH在Zend Framework中编写配置

时间:2011-05-16 07:51:40

标签: zend-framework config

对于应用程序,我想创建某种设置步骤。在其中一个步骤中,数据库配置将写入application.ini文件。这一切都有效,但发生了一些非常奇怪的事情:目录的所有路径(库,布局......)都是用带有APPLICATION_PATH的路径改变的。到完整的路径。可以想象,这不是非常系统友好的。知道如何防止这种情况吗?

我使用以下代码更新application.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();

3 个答案:

答案 0 :(得分:1)

由于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对象后,我想这应该也可以...

答案 1 :(得分:0)

我猜您可以迭代这些值,检查APPLICATION_PATH之间的匹配,并将其替换为字符串 literal {{ 1}}。

如果您知道APPLICATION_PATH包含字符串APPLICATION_PATH并且您找到配置值'/home/david/apps/myapp/application',那么您可以替换前导字符串'/home/david/apps/myapp/application/views/helpers'使用字符串'/home/david/apps/myapp/application',最后是'APPLICATION_PATH'

有点像kludge,但这样的东西可能有用。

答案 2 :(得分:0)

这是一个很长的镜头 - 但您是否尝试在Zend_Config_Writer_Ini常量 定义的情况下运行APPLICATION_PATH代码?它应该将其解释为文字字符串'APPLICATION_PATH'并且可能有效。