Есть у меня один знакомый, который разрабатывает проект на Zend Framework 1. А у знакомого есть клиенты, которым он каждый раз создаёт копию своего проекта. К слову, он этот проект клонирует не только для клиентов, но и для разработчиков. В результате на сервере хранятся несколько сотен копий этого проекта. И всё было бы хорошо, да только приспичило знакомому менять настройки в
application.ini
, да ещё и во всех проектах сразу.
Есть INI-файл формата Zend Framework 1:
[production]
foo = SOME_CONST "bar"; Комментарий
[testing : production]
foo = baz
Нужно написать код, который бы позволял изменять существующие значения настроек, а также добавлять новые настройки и секции.
В своей реализации я использовал объектный подход, но это не обязательно. Самое главное получить правильный результат.
<?php
$iniText = '[production]
foo = SOME_CONST "bar"; Комментарий
[testing : production]
foo = baz';
$ini = new class ($iniText) {
// Реализация процессора
};
$ini->setRawValue('production.fee', 'CONST "faa" ; Ещё комметарий' . PHP_EOL);
$ini->setRawValue('testing.foo', '"Новое тестовое значение"');
$ini->setRawValue('new_section.bar.baz.bee', '"Новое значение в новой секции"');
echo $ini, PHP_EOL;
Правильный результат работы:
[production]
foo = SOME_CONST "bar"; Комментарий
fee = CONST "faa" ; Ещё комметарий
[testing : production]
foo = "Новое тестовое значение"
[new_section]
bar.baz.bee = "Новое значение в новой секции"
В теории в zf1 есть реализация работы с INI-файлами в нужном формате, но я не хотел наткнуться на скрытые баги при работе с этими компонентами. Моя реализация оказалась проще и надёжней, поскольку на 100% уверен в том, как она работает.