Как организовать файлы конфигурации

Костяк 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):

  • YAML
    1
    2
    3
    4
    5
    6
    # config/services.yaml
    imports:
        - { resource: 'my_config_file.xml' }
        - { resource: 'legacy.php' }
    
    # ...
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    <!-- config/services.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/symfony
            http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
    
        <imports>
            <import resource="my_config_file.yaml" />
            <import resource="legacy.php" />
        </imports>
    
        <!-- ... -->
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    // config/services.php
    $loader->import('my_config_file.yaml');
    $loader->import('legacy.xml');
    
    // ...
    

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

Глобальные файлы конфигурации

Некоторые системные администраторы предпочитают хранить чувствительные параметры в файлах вне каталога проекта. Предсьавьте, что учетные данные БД для вашего сайта хранятся в файле /etc/sites/mysite.com/parameters.yaml. Загрузка этого файла просто заключается в указании полного пути файла при его импорте из любого другого файла конфигурации:

  • YAML
    1
    2
    3
    4
    5
    # config/services.yaml
    imports:
        - { resource: '/etc/sites/mysite.com/parameters.yaml', ignore_errors: true }
    
    # ...
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    <!-- config/services.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/symfony
            http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
    
        <imports>
            <import resource="/etc/sites/mysite.com/parameters.yaml" ignore-errors="true" />
        </imports>
    
        <!-- ... -->
    </container>
    
  • PHP
    1
    2
    3
    4
    // config/services.php
    $loader->import('/etc/sites/mysite.com/parameters.yaml', null, true);
    
    // ...
    

Tip

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

Как вы увидели, существует множество способов организовать ваши файлы конфигурации. Вы можете выбрать один из них или даже создать ваш собственный способ организации файлов. Не чувствуйте себя ограниченными стандартной версией Symfony. Для еще более детального настраивания, смотрите "How to Override Symfony's default Directory Structure".

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.