Как сохранить пути application.ini с помощью Zend_Config_Writer_Ini

В настоящее время я работаю над системой сборки в Phing, которая принимает шаблон проекта Zend Framework и настраивает его в соответствии с параметрами Phing. Одна проблема, с которой я столкнулся, – это использовать Zend_Config_Writer_Ini.

Моя задача Phing берет предварительно заполненный файл из репо под названием application.default.ini и модифицирует его с помощью Zend_Config_Ini, чтобы добавить параметры из файла сборки (данные db и т. Д.). Затем он записывает его в 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, которые мне нужно изменить?

Когда вы загружаете существующую конфигурацию, все константы уже переведены, т.е. если вы посмотрите на объект с помощью print_r, вы больше не найдете своих констант. Следовательно, с писателем полный текст печатается вместо констант.

В вашем случае я предполагаю, что константы не существуют в вашей среде и поэтому печатаются как есть.

Обновление : Чтобы быть более конкретным. Zend_Config_Ini::_parseIniFile() использует parse_ini_file() для чтения ini-файла, который загружает константы в качестве реальных путей. См. Php.net doc Пример №2

Прямо из этого комментария php.net :

Константы в ini-файлах не расширяются, если они объединены с строками, процитированными одинарными кавычками, они должны быть в двойных кавычках только для того, чтобы расширять константы.

Пример:

define ('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 '*' двойными кавычками (должно выполняться простое Regex).

В качестве альтернативы вы можете использовать Phing's Filter для замены токенов в вашем шаблоне конфигурации.

Пример задачи:

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

Эта задача копирует application/configs/application.ini.dist в application/configs/application.ini и заменяет маркеры вроде ##DB_HOSTNAME## значением из свойства phing ${db.host}

Я хотел бы использовать Zend_Config, сохраняя возможность использования константы APPLICATION_PATH, поэтому я решил установить файл с помощью простого регулярного выражения после сохранения файла 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)); - $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));