
При разработке часто приходится поддерживать сразу несколько окружений: development, staging. production итд., которые могут иметь довольно разные настройки. Самый простой пример это параметры соединения с базой данных, но иногда хочется изменить не только один параметр а целую секцию, например логирование или бэкенд для кеша. К тому же при разработки различных CMS иногда хочется вынести некоторые настройки на видное место, чтобы пользователю легче было их найти. Посмотрим как эти проблемы решается в PHPixie. Ну и конечно же все это работает без самого фреймворка и намного легче пакета symfony/config.
Параметры
Самое просто что мы можем сделать это создать несколько переменных которые потом использовать в конфиге, для этого создаем файл /assets/parameters.php:
<?php // /assets/parameters.php return [ 'apiToken' => 'jdf73jdhgj', // вложенные массивы тоже поддерживаются 'database' => [ 'connection' => 'mysql:host=localhost;dbname=quickstart', 'user' => 'root', 'password' => 'secret' ] ];
Теперь мы можем использовать их в файлах конфигурации через %имя%, например:
<?php // /assets/config/database.php return [ 'default' => [ 'driver' => 'pdo', 'connection' => '%database.connection%', 'user' => '%database.user%', 'password' => '%database.password%' ] ];
Как результат мы отделяем сами переменные от того где они используются. Разумно затем добавить parameters.php в .gitignore и тогда кодом можно свободно делится на гитхабе.
Но что если нам нужно больше? Например добавить несколько роутов которые работают только у разработчиков и отключены в продакшене? Для этого нам понадобится оверлей.
Оверлеи
Допустим в одной из конфигураций мы хотим также подключить базу данных на MongoDB. Для этого создаем папку в с каким-то красивым именем, например local и добавляем туда локальные изменения:
<?php // /assets/config/local/database.php return [ // поскольку мы указываем другое имя соединения // то уже определенное соединение 'default' не изменится. // Оверлеи работают по принципу array_replace_recursive() 'mongo' => [ 'driver' => 'mongo', 'database' => '%mongo.database%', 'user' => '%mongo.user%', 'password' => '%mongo.password%', ] ];
Если изменений мало можно даже не создавать папку а просто положить все в один файл:
<?php // /assets/config/local.php return [ 'database' => [ // Еще раз подметим что в оверлей надо писать только // изменения, и не надо копировать содержимое базового файла // с соединением 'default' 'mongo' => [ 'driver' => 'mongo', 'database' => '%mongo.database%', 'user' => '%mongo.user%', 'password' => '%mongo.password%', ] ] ];
Осталось только его включить, для этого в parameters.php добавляем одну строчку:
<?php // /assets/parameters.php return [ 'configOverlay' => 'local', // ... ];
Конечно же можно создать несколько таких оверлеев и переключатся между ними как угодно.
Как посмотреть результат?
Для отладки:
print_r($frameworkBuilder->configuration()->config()->get());
Использование без фреймворка
Весь функционал добавлен в базовые библиотеки Slice и Config. При создании конфигурации мы можем указать другую конфигурацию или Slice из которого будут грузится параметры:
$configBuilder = new \PHPixie\Config(); $parameterStorage = $configBuilder->file('parameters.php'); $rootDir = ...; // папка в которой лежит папка с конфигом (на уровень выше) $dirName = 'config'; // имя папки с конфигом $configuration = $configBuilder->directory($rootDir, $dirName, 'php', $parameterStorage);
С оверлеем еще проще, фактически можно слить два инстанса Slice или конфигурации в один. При этом ленивая подгрузка файлов продолжит нормально работать.
$sliceBuilder = new \PHPixie\Slice(); $configBuilder = new \PHPixie\Config(); $configuration = $configBuilder->file('config.php'); $overlay = $configBuilder->file('overlay.php'); $merged = $sliceBuilder->mergeData($configuration, $overlay);
