Come conservare i routes application.ini usando Zend_Config_Writer_Ini

Attualmente sto lavorando a un sistema di compilazione in Phing che prende un model di progetto Zend Framework e lo configura in base ai parametri di Phing. Un problema che ho riscontrato è quando si utilizza Zend_Config_Writer_Ini.

L'attività My Phing prende un file pre-compilato dal repository chiamato application.default.ini e lo modifica utilizzando Zend_Config_Ini per aggiungere parametri dal file di build (dettagli db, ecc.). Quindi lo scrive su application.ini pronto per essere utilizzato dal progetto. Una versione semplificata del relativo codice attività è simile a questa:

$appConfig = new Zend_Config_Ini( $appDefaultConfigPath, null, arrays( '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(); 

Funziona bene per quanto riguarda le credenziali del database, ma quando si tratta di routes pre-popolati che includono costanti definite, qualcosa va storto. Per esempio:

 bootstrap.path = APPLICATION_PATH "/Bootstrap.php" 

diventa:

 bootstrap.path = "APPLICATION_PATH/Bootstrap.php" 

C'è un modo per preservare queste linee di configuration durante la lettura / scrittura su diversi file ini o devo ristrutturare il mio file di build per copiare il file prima di eseguire l'attività e modificare solo le linee ini che ho bisogno di cambiare?

Quando carichi la configuration esistente tutte le costanti sono già state tradotte, cioè se guardi l'object con print_r non troverai più le tue costanti. Quindi, con lo scrittore viene printingto il path completo invece delle costanti.

Nel tuo caso, suppongo che le costanti non esistano nel tuo ambiente e quindi vengano printingte così come sono.

Aggiornamento : per essere più specifici. Zend_Config_Ini::_parseIniFile() usa parse_ini_file() per leggere il file ini che carica le costanti come routes reali. Vedi php.net doc Esempio # 2

Direttamente da questo commento php.net :

Le costanti nei file ini non vengono espanse se sono concatenate con stringhe citate con virgolette singole, devono essere racchiuse tra virgolette doppie per rendere espanse le costanti.

Esempio:

define ('APP_PATH', '/ some / path');

mypath = APP_PATH '/ config' // La costante non verrà espansa: [mypath] => APP_PATH '/ config'

mypath = APP_PATH "/ config" // La costante verrà espansa: [mypath] => / some / path / config

Quindi potresti riscrivere i tuoi routes con virgolette singole … bootstrap.path = APPLICATION_PATH '/Bootstrap.php'

… e successivamente sostituisci tutte le occorrenze di APPLICATION_PATH '*' con virgolette doppie (un Regex semplice dovrebbe fare).

In alternativa è ansible utilizzare il filter di Phing per sostituire i token nel model di configuration.

Un task di esempio:

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

Questa attività copia application/configs/application.ini.dist in application/configs/application.ini e sostituisce token come ##DB_HOSTNAME## con il valore dalla properties; phing ${db.host}

Volevo la comodità di usare Zend_Config preservando la possibilità di utilizzare la costante APPLICATION_PATH, così ho finito per correggere il file con una semplice espressione regolare dopo che Zend_Config_Writer ha salvato il file.

 $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));