Pull to refresh

Гибкая конфигурация c PHPixie

Reading time 3 min
Views 5.4K
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);
Tags:
Hubs:
+5
Comments 12
Comments Comments 12

Articles