Введение в параметры

Введение в параметры

Вы можете определять параметры в сервис-контейнере, которые потом могут быть использоваы напрямую, или как часть определений сервиса. Это может помочь отделить значения, которые вы захотите изменять регулярнее.

Параметры в файлах конфигурации

Используйте раздел parameters файла конфигурации, чтобы установить параметры:

  • YAML
    1
    2
    parameters:
        mailer.transport: sendmail
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    <?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="mailer.transport">sendmail</parameter>
        </parameters>
    </container>
    
  • PHP
    1
    $container->setParameter('mailer.transport', 'sendmail');
    

Вы можете ссылаться на параметры где угодно в любом файле конфигурации, окружив их знаками процента (%), например, %mailer.transport%. Одним из методов применения этого является внедрение значений в ваши сервисы. Это позволяет вам сконфигурировать разные версии сервисов между приложениями или несколько сервисов, основанных на одном классе, но сконфигурированных по-разному в рамках одного приложения. Вы можете внедрить выбор почтового транспорта в класс Mailer напрямую. Но объявление его в качестве параметра упрощает изменения, вместо того, чтобы связывать его и прятать в определении сервиса:

  • YAML
    1
    2
    3
    4
    5
    6
    parameters:
        mailer.transport: sendmail
    
    services:
        AppBundle\Service\Mailer:
            arguments: ['%mailer.transport%']
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    <?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="mailer.transport">sendmail</parameter>
        </parameters>
    
        <services>
            <service id="AppBundle\Service\Mailer">
                <argument>%mailer.transport%</argument>
            </service>
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    use AppBundle\Service\Mailer;
    use Symfony\Component\DependencyInjection\Reference;
    
    $container->setParameter('mailer.transport', 'sendmail');
    
    $container->register(Mailer::class)
        ->addArgument('%mailer.transport%');
    

Caution

Значения между тегами parameter в файлах конфигурации XML не усекаются.

Это означает, что следующий пример конфигурации будет иметь значение \n sendmail\n:

1
2
3
<parameter key="mailer.transport">
    sendmail
</parameter>

В некоторых случаях (для констант или имён класса), это может вызвать ошибки. Чтобы предотвратить это, вы должны всегда встраивать ваши параметры следующим образом:

1
<parameter key="mailer.transport">sendmail</parameter>

Note

Если вы используете строку, начинающуюся с @ или имеющую % в любом месте, вам нужно экранировать её, добавив ещё один @ или %:

  • YAML
    1
    2
    3
    4
    5
    6
    7
    # app/config/parameters.yml
    parameters:
        # Это будет интерпретрировано, как строка '@securepass'
        mailer_password: '@@securepass'
    
        # Интерпретировано, как http://symfony.com/?foo=%s&amp;bar=%d
        url_pattern: 'http://symfony.com/?foo=%%s&amp;bar=%%d'
    
  • XML
    1
    2
    3
    4
    5
    6
    7
    <parameters>
        <!-- символ @ symbol НЕ надо экранировать в XML -->
        <parameter key="mailer_password">@securepass</parameter>
    
        <!-- Но % надо экранировать -->
        <parameter key="url_pattern">http://symfony.com/?foo=%%s&amp;bar=%%d</parameter>
    </parameters>
    
  • PHP
    1
    2
    3
    4
    5
    // символ @ НЕ надо экранировать в XML
    $container->setParameter('mailer_password', '@securepass');
    
    // Но % надо экранировать
    $container->setParameter('url_pattern', 'http://symfony.com/?foo=%%s&amp;bar=%%d');
    

Получение и установка параметров контейнера в PHP

Работа с параметрами контейнера прямолинейна при использовании методов доступа контейнера для параметров:

1
2
3
4
5
6
7
8
// проверьте, определён ли параметр
$container->hasParameter('mailer.transport');

// получите значение параметра
$container->getParameter('mailer.transport');

// добавьте новый параметр
$container->setParameter('mailer.transport', 'sendmail');

Caution

Использованная нотация . - это просто соглашение Symfony, чтобы сделать параметры более лёгкими для прочтения. Параметры являются просто линейными ключевыми значениями элементов, они не могут быть органзованы во вложенный массив.

Note

Вы можете установить параметр только до того, как был скомпилирован контейнер: не во время прогона. Чтобы узнать больше о компиляции контейнера, см. Compiling the Container.

Параметры массива

Параметры не должны быть линейными строками, они также могут содержать значения массива. Для формата XML вам нужно использовать атрибут type="collection" для всех параметров, являющихся массивами.

  • YAML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    parameters:
        my_mailer.gateways: [mail1, mail2, mail3]
    
        my_multilang.language_fallback:
            en:
                - en
                - fr
            fr:
                - fr
                - en
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <?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="my_mailer.gateways" type="collection">
                <parameter>mail1</parameter>
                <parameter>mail2</parameter>
                <parameter>mail3</parameter>
            </parameter>
    
            <parameter key="my_multilang.language_fallback" type="collection">
                <parameter key="en" type="collection">
                    <parameter>en</parameter>
                    <parameter>fr</parameter>
                </parameter>
    
                <parameter key="fr" type="collection">
                    <parameter>fr</parameter>
                    <parameter>en</parameter>
                </parameter>
            </parameter>
        </parameters>
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    $container->setParameter('my_mailer.gateways', array('mail1', 'mail2', 'mail3'));
    $container->setParameter('my_multilang.language_fallback', array(
        'en' => array('en', 'fr'),
        'fr' => array('fr', 'en'),
    ));
    

Переменные окружения и динамические значения

Смотрите How to Set external Parameters in the Service Container.

Константы как параметры

Установка PHP-констант как параметров также поддерживается. Чтобы воспользоваться преимуществами этой функции, свяжите имя вашей константы с ключом параметра и определите тип, как constant.

  • YAML
    1
    2
    3
    parameters:
        global.constant.value: !php/const:GLOBAL_CONSTANT
        my_class.constant.value: !php/const:My_Class::CONSTANT_NAME
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    <?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="global.constant.value" type="constant">GLOBAL_CONSTANT</parameter>
            <parameter key="my_class.constant.value" type="constant">My_Class::CONSTANT_NAME</parameter>
        </parameters>
    </container>
    
  • PHP
    1
    2
    $container->setParameter('global.constant.value', GLOBAL_CONSTANT);
    $container->setParameter('my_class.constant.value', My_Class::CONSTANT_NAME);
    

Ключевые слова PHP в XML

По умолчанию, true, false и null в XML конвертируются в ключевые слова PHP (соответственно true, false и null):

1
2
3
4
5
6
7
<parameters>
    <parameter key="mailer.send_all_in_once">false</parameter>
</parameters>

<!-- after parsing
$container->getParameter('mailer.send_all_in_once'); // returns false
-->

Чтобы отключить это поведение, используйте тип string:

1
2
3
4
5
6
7
<parameters>
    <parameter key="mailer.some_parameter" type="string">true</parameter>
</parameters>

<!-- after parsing
$container->getParameter('mailer.some_parameter'); // returns "true"
-->

Note

Это недоступно для YAML или PHP, так как они уже имеют встроенную поддержку ключевых слов PHP.

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