При разработке часто приходится поддерживать сразу несколько окружений: development, staging. production итд., которые могут иметь довольно разные настройки. Самый простой пример это параметры соединения с базой данных, но иногда хочется изменить не только один параметр а целую секцию, например логирование или бэкенд для кеша. К тому же при разработки различных CMS иногда хочется вынести некоторые настройки на видное место, чтобы пользователю легче было их найти. Посмотрим как эти проблемы решается в PHPixie.
Параметры
Самое просто что мы можем сделать это создать несколько переменных которые потом использовать в конфиге, для этого создаем файл /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);
Поделиться с друзьями