Pull to refresh

Подстановка значений в Zend_Config

Reading time2 min
Views693
Когда в конфигурационном файле возникает необходимость использовать подстановку значений, официальная документация недвузначно намекает на применение, ИМХО, не самой удачной практики — использование констант в INI-файлах, например так:

[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 своего проекта. Може, есть какие-то идеи?
Tags:
Hubs:
+3
Comments15

Articles