Как устанавливать внешние параметры в сервис-контейнере

В статье Configuring Symfony (and Environments) вы узнали, как управлять конфигурацией вашего приложения. В некоторых случаях вашему приложению может пойти на пользу хранение некоторых сертификатов вне кода вашего проекта. Конфигурация БД является одним из таких примеров. Гибкость сервис-контейнера Symfony позволяет вам с лёгкостью делать это.

Переменные окружения

New in version 3.2: Параметры env() были представлены в Symfony 3.2.

Вы можете ссылаться на переменные окружения, используя специальные параметры, названные в честь тех переменных, которые вы хотите использовать, окружённые env(). Их настоящие значения будут разрешены во время прогона (единожды на запрос), чтобы сброшенные контейнеры могли быть вновь динамически сконфигурированы даже после компиляции.

Например, если вы хотите использовать значение переменной окружения DATABASE_HOST в конфигурации вашего сервис-контейнера, вы можете сослаться на него, используя %env(DATABASE_HOST)% в ваших файлах конфигурации:

  • YAML
    1
    2
    3
    4
    # app/config/config.yml
    doctrine:
        dbal:
            host: '%env(DATABASE_HOST)%'
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    <!-- app/config/config.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"
        xmlns:doctrine="http://symfony.com/schema/dic/doctrine"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/doctrine
            http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd">
    
        <doctrine:config>
            <doctrine:dbal
                host="%env(DATABASE_HOST)%"
            />
        </doctrine:config>
    
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    // app/config/config.php
    $container->loadFromExtension('doctrine', array(
        'dbal' => array(
            'host' => '%env(DATABASE_HOST)%',
        )
    ));
    

Вы также можете дать параметрам env() значение по умолчанию: оно будет использовано каждый раз, когда не будет найдена соответстующая переменная окружения:

  • YAML
    1
    2
    3
    4
    # app/config/parameters.yml
    parameters:
        database_host: '%env(DATABASE_HOST)%'
        env(DATABASE_HOST): localhost
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    <!-- app/config/parameters.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">
    
        <parameters>
            <parameter key="database_host">%env(DATABASE_HOST)%</parameter>
            <parameter key="env(DATABASE_HOST)">localhost</parameter>
        </parameters>
     </container>
    
  • PHP
    1
    2
    3
    // app/config/parameters.php
    $container->setParameter('database_host', '%env(DATABASE_HOST)%');
    $container->setParameter('env(DATABASE_HOST)', 'localhost');
    

Установка переменных окружения обычно проводится на уровне веб-сервера или в терминале. Если вы используете Apache, Nginx или просто консоль, вы можете использовать, к примеру, одно из следующих:

  • Apache
    1
    2
    3
    4
    5
    6
    <VirtualHost *:80>
        # ...
    
        SetEnv DATABASE_USER user
        SetEnv DATABASE_PASSWORD secret
    </VirtualHost>
    
  • Nginx
    1
    2
    fastcgi_param DATABASE_USER user;
    fastcgi_param DATABASE_PASSWORD secret;
    
  • Terminal
    1
    2
    $ export DATABASE_USER=user
    $ export DATABASE_PASSWORD=secret
    

Tip

New in version 3.3: Поддержка специальных переменных окружения SYMFONY__ была осуждена в Symfony 3.3 и будет удалена в версии 4.0. Вместо того, чтобы использовать эти переменные, определите обычные переменные окружения и получите их значения, используя синтаксис %env(...)% в ваших файлах конфигурации.

Вы также можете определить значение по умолчанию для любого из существующих параметров, используя специальные переменные окружения, названные в честь соответствующего им параметра, с префиксом SYMFONY__ заменив точки двойным нижним подчёркиванием (например, SYMFONY__KERNEL__CHARSET, чтобы установить значение по умолчанию для параметра kernel.charset). Эти значения по умолчанию разрешаются при компиляции сервис-контейнера и не изменятся во время прогона после сброса.

Константы

Контейнер также имеет поддержку для установки PHP-констант в качестве параметров. См. Константы как параметры, чтобы узнать больше деталей.

Смешанная конфигурация

Директива imports может быть использована для извлечения параметров, хранящихся где-то. Импортирование PHP-файла даёт вам гибкость для добавления в контейнер всего, что необходимо. Следующий код импортирует файл под названием parameters.php.

  • YAML
    1
    2
    3
    # app/config/config.yml
    imports:
        - { resource: parameters.php }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    <!-- app/config/config.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">
    
        <imports>
            <import resource="parameters.php" />
        </imports>
    
    </container>
    
  • PHP
    1
    2
    // app/config/config.php
    $loader->import('parameters.php');
    

Note

Файл источника может иметь один из многих типов. PHP, XML, YAML, INI, и источник замыкания - все поддерживаются директивой imports.

В parameters.php, сообщите сервис-контейнеру параметры, которые вы хотите установить. Это полезно, когда важная конфигурация имеет нестандартный формат. Пример ниже включает в себя конфигурацию БД Drupal в сервис-контейнере Symfony.

1
2
3
// app/config/parameters.php
include_once('/path/to/drupal/sites/default/settings.php');
$container->setParameter('drupal.database.url', $db_url);

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