Як організувати файли конфігурації

Дата оновлення перекладу 2023-06-07

Як організувати файли конфігурації

Основв Symfony визначає три середовища виконання під назвами dev, prod і test. Середовищее просто надає спосіб виконати одну й ту саму кодову базу з різними конфігураціями.

Для того, щоб вибрати файл конфігурації для завантаження в кожному середовищі, Symfony виконує метод configureContainer() класу Kernel:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// src/Kernel.php
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Kernel as BaseKernel;

class Kernel extends BaseKernel
{
    const CONFIG_EXTS = '.{php,xml,yaml,yml}';

    // ...

    public function configureContainer(ContainerBuilder $container, LoaderInterface $loader)
    {
        $confDir = $this->getProjectDir().'/config';
        $loader->load($confDir.'/packages/*'.self::CONFIG_EXTS, 'glob');
        if (is_dir($confDir.'/packages/'.$this->environment)) {
            $loader->load($confDir.'/packages/'.$this->environment.'/**/*'.self::CONFIG_EXTS, 'glob');
        }
        $loader->load($confDir.'/services'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/services_'.$this->environment.self::CONFIG_EXTS, 'glob');
    }
}

Для середовища dev, Symfony завантажує наступні файли конфігуррації та каталоги в такому порядку:

  1. config/packages/*
  2. config/packages/dev/*
  3. config/services.yaml
  4. config/services_dev.yaml

Відповідно, файли конфігурації додатків Symfony за замовчуванням дотримуються такої структури:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
your-project/
├─ config/
│  └─ packages/
│     ├─ dev/
|     │  ├─ framework.yaml
│     │  └─ ...
│     ├─ prod/
│     │  └─ ...
│     ├─ test/
│     │  └─ ...
|     ├─ framework.yaml
│     └─ ...
│     ├─ services.yaml
│     └─ services_dev.yaml
├─ ...

Цю структуру за замовчуванням було обрано у зв'язку з її простотою - один файл у пакеті і середовищі. Але, як і будь-яку іншу функцію Symfony, ви можете налаштовувати її, щоб вона більше відповідала вашим потребам.

Просунуті техніки

Symfony завантажує файли конфігурації, використовуючи Config component, який надає деякі просунуті функції.

Змішані формати конфігурації

Файли конфігурації можуть імпортувати файли, визначені будь-яким іншим вбудованим форматом конфігурації (.yaml або .yml, .xml, .php, .ini):

1
2
3
4
5
6
# config/services.yaml
imports:
    - { resource: 'my_config_file.xml' }
    - { resource: 'legacy.php' }

# ...

Якщо ви використовуєте будь-який інший формат конфігурації, вам потрібно визначити власний клас завантажувача, розширивши його з FileLoader. Коли значення конфігурації динамічні, ви можете використовувати файл PHP конфігурації, щоб виконувати власну логіку. Крім того, ви можете визначати ваші власні сервіси для завантаження конфігурацій з баз даних або веб-сервісів.

Глобальні файли конфігурації

Деякі системні адміністратори вважають за краще зберігати чутливі параметри у файлах поза каталогом проекту. Припустимо, що облікові дані DB для вашого сайту зберігаються у файлі /etc/sites/mysite.com/parameters.yaml. Завантаження цього файлу просто полягає у зазначенні повного шляху файлу при його імпорті з будь-якого іншого файлу конфігурації:

1
2
3
4
5
# config/services.yaml
imports:
    - { resource: '/etc/sites/mysite.com/parameters.yaml', ignore_errors: true }

# ...

Tip

Опція ignore_errors (яка є третім необов'язковим аргументом у методі завантажувача import()) тихо скидає помилки, коли завантажений файл не існує. Це необхідно в цьому випадку, так як в більшості раз, локальні розробники не матимуть ті самі файли, що існують на серверах виробництва.

Як ви побачили, існує безліч способів організувати ваші файли конфігурації. Ви можете вибрати один із них або навіть створити свій власний спосіб організації файлів. Не відчувайте себе обмеженими стандартною версією Symfony. Для ще більш детального налаштування, дивіться "Як перевизначити структуру каталогів Symfony за замовчуванням".