Вступ у параметри

Вступ у параметри

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

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

Використайте розділ 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&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" для усіх параметрів, які є масивами.

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.