3

私は現在、Zend Framework プロジェクト テンプレートを受け取り、Phing パラメーターに従って構成する Phing のビルド システムに取り組んでいます。私が遭遇した問題の 1 つは、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

この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>

このタスクは、phing プロパティの値などのトークンをコピーapplication/configs/application.ini.distして置き換えますapplication/configs/application.ini##DB_HOSTNAME##${db.host}

于 2011-07-13T07:40:01.977 に答える
1

既存の設定をロードすると、すべての定数はすでに変換されています。つまり、オブジェクトを print_r で見ると、定数が見つかりません。したがって、ライターでは、定数の代わりにフル パスが出力されます。

あなたの場合、定数はあなたの環境に存在しないため、そのまま印刷されると思います。

更新:より具体的に。Zend_Config_Ini::_parseIniFile()を使用parse_ini_file()して、定数を実際のパスとしてロードする ini ファイルを読み取ります。php.net doc の例 #2を参照してください。

于 2011-07-12T22:49:02.350 に答える
0

APPLICATION_PATH定数を使用する機能を維持しながら、Zend_Configを使用する便利さが欲しかったので、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 に答える