php zend-framework ini phing zend-config

php - Cómo preservar las rutas de application.ini usando Zend_Config_Writer_Ini



zend-framework phing (4)

Como alternativa, puede usar el filtro de Phing para reemplazar tokens en su plantilla de configuración.

Una tarea de ejemplo:

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

Esta tarea copia application/configs/application.ini.dist en application/configs/application.ini y reemplaza tokens como ##DB_HOSTNAME## con el valor de la propiedad de phing ${db.host}

Actualmente estoy trabajando en un sistema de compilación en Phing que toma una plantilla de proyecto de Zend Framework y la configura de acuerdo con los parámetros de Phing. Un problema con el que me he encontrado es al usar Zend_Config_Writer_Ini.

La tarea My Phing toma un archivo rellenado previamente del repositorio llamado application.default.ini y lo modifica usando Zend_Config_Ini para agregar parámetros desde el archivo de compilación (detalles de db, etc.). Luego lo escribe en application.ini listo para que el proyecto lo use. Una versión simplificada del código de la tarea relacionada se ve más o menos así:

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

Esto funciona bien en lo que respecta a las credenciales de la base de datos, pero cuando se trata de rutas pre-pobladas que incluyen constantes definidas, algo sale mal. Por ejemplo:

bootstrap.path = APPLICATION_PATH "/Bootstrap.php"

se convierte en:

bootstrap.path = "APPLICATION_PATH/Bootstrap.php"

¿Hay alguna manera de preservar estas líneas de configuración al leer / escribir en diferentes archivos ini o debo reestructurar mi archivo de compilación para copiar el archivo antes de ejecutar la tarea y solo modificar las líneas de entrada que necesito cambiar?


Cuando carga la configuración existente, todas las constantes ya están traducidas, es decir, si mira el objeto con print_r ya no encontrará sus constantes. Por lo tanto, con el escritor se imprime la ruta completa en lugar de las constantes.

En su caso, supongo que las constantes no existen en su entorno y, por lo tanto, están impresas tal como están.

Actualización : para ser más específico. Zend_Config_Ini::_parseIniFile() usa parse_ini_file() para leer el archivo ini que carga las constantes como rutas reales. Ver php.net doc Ejemplo # 2


Directamente de este comentario de php.net :

Las constantes en los archivos ini no se expanden si se concatenan con cadenas entre comillas simples, sino que deben estar entre comillas dobles para hacer que las constantes se expandan.

Ejemplo:

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

mypath = APP_PATH ''/ config'' // La constante no se expandirá: [mypath] => APP_PATH ''/ config''

mypath = APP_PATH "/ config" // La constante se expandirá: [mypath] => / some / path / config

Para que pueda volver a escribir sus pathes con comillas simples ... bootstrap.path = APPLICATION_PATH ''/Bootstrap.php''

... y luego reemplazar todas las ocurrencias de APPLICATION_PATH ''*'' con comillas dobles (una Regex simple debería hacer).


Quería la conveniencia de usar Zend_Config mientras conservaba la capacidad de usar la constante APPLICATION_PATH, así que terminé arreglando el archivo con una expresión regular simple después de que Zend_Config_Writer guardara el archivo.

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