Когда в конфигурационном файле возникает необходимость использовать подстановку значений, официальная документация недвузначно намекает на применение, ИМХО, не самой удачной практики — использование констант в INI-файлах, например так:
Я написал небольшой класс, который наследует и расширяет функциональность Zend_Config, позволяя использовать такой синтаксис:
Вот пример его использования:
[production]
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
Я написал небольшой класс, который наследует и расширяет функциональность Zend_Config, позволяя использовать такой синтаксис:
[production]
path.application = "${path.root}/application"
path.configs = "${path.application}/configs"
includePaths.library = "${path.root}/library"
Вот пример его использования:
// окружение определяется заранее
$environment = 'production';
// опредеялем путь к корню проекта
$rootPath = dirname(__FILE__);
// определяем путь к конфигу относительно корня проекта
$configPath = rootPath . '/application/configs/application.ini';
// загружаем "сырой" конфиг без подстановки значений
// и с отключенным режимом read-only
$configRaw = new Zend_Config_Ini($configPath, $environment, true);
// присваиваем путь к корню проекта переменной конфига
$configRaw->path->root = $rootPath;
// выполняем подстановку значений, превращая "сырой" конфиг в "обработанный"
$config = Inf_Config_Placeholder($configRaw);
// далее используем конфиг, как обычно
* This source code was highlighted with Source Code Highlighter.
Одним из ограничений класса является отсутствие проверки на бесконечную рекурсию, вроде этой:
[production]
foo = "${bar}"
bar = "${foo}"
Пожалуйста, избегайте подобных конструкций, так как выполнение бесконечной рекурсии занимает 7 секунд даже на самых современных серверах.
Код класса Inf_Config_Placeholder доступен на GitHub.
P.S. Формат репозитория на GitHub'е - немного странный, потому что я не нашел более удачного формата для его использования в виде субмодуля в директории library своего проекта. Може, есть какие-то идеи?