Гнучка конфігурація c PHPixie

image

При розробці часто доводиться підтримувати відразу кілька оточень: 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);

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.