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

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

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

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

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

  • YAML
  • XML
  • PHP
1
2
parameters:
    mailer.transport: sendmail

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

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
parameters:
    mailer.transport: sendmail

services:
    AppBundle\Service\Mailer:
        arguments: ['%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
  • XML
  • PHP
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'

Получение и установка параметров контейнера в 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

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

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

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

  • YAML
  • XML
  • PHP
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

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

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

  • YAML
  • XML
  • PHP
1
2
3
parameters:
    global.constant.value: !php/const:GLOBAL_CONSTANT
    my_class.constant.value: !php/const: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.