Введение в параметры
Введение в параметры
Вы можете определять параметры в сервис-контейнере, которые потом могут быть использоваы напрямую, или как часть определений сервиса. Это может помочь отделить значения, которые вы захотите изменять регулярнее.
Параметры в файлах конфигурации
Используйте раздел parameters
файла конфигурации, чтобы установить параметры:
1 2
parameters:
mailer.transport: sendmail
Вы можете ссылаться на параметры где угодно в любом файле конфигурации, окружив
их знаками процента (%
), например, %mailer.transport%
. Одним из методов
применения этого является внедрение значений в ваши сервисы. Это позволяет вам
сконфигурировать разные версии сервисов между приложениями или несколько сервисов,
основанных на одном классе, но сконфигурированных по-разному в рамках одного
приложения. Вы можете внедрить выбор почтового транспорта в класс Mailer
напрямую.
Но объявление его в качестве параметра упрощает изменения, вместо того, чтобы связывать
его и прятать в определении сервиса:
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
Если вы используете строку, начинающуюся с @
или имеющую %
в любом
месте, вам нужно экранировать её, добавив ещё один @
или %
:
1 2 3 4 5 6 7
# app/config/parameters.yml
parameters:
# Это будет интерпретрировано, как строка '@securepass'
mailer_password: '@@securepass'
# Интерпретировано, как http://symfony.com/?foo=%s&bar=%d
url_pattern: 'http://symfony.com/?foo=%%s&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"
для
всех параметров, являющихся массивами.
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
.
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.