Як впроваджувати значення, засновані на складних виразах

Дата оновлення перекладу 2022-11-25

Як впроваджувати значення, засновані на складних виразах

Сервіс-контейнер також підтримує "вираз", який дозволяє вам впроваджувати особливі значення у сервіс.

Наприклад, уявіть, що у вас є сервіс (тут не показаний) під назвою App\Mail\MailerConfiguration, який має в собі метод getMailerMethod(). Він повертає рядок на кшталт sendmail, засновуючись на якійсь конфігурації.

Уявіть, що ви хочете передати результато цього методу в якості аргументу конструктора іншому сервісу: App\Mailer. Один зі способів зробити це - за допомогою виразу:

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
7
8
9
10
11
# config/services.yaml
services:
    # ...

    App\Mail\MailerConfiguration: ~

    App\Mailer:
        # префікс '@=' обовʼязковий при використанні виразів для аргументів у файлах YAML
        arguments: ['@=service("App\\Mail\\MailerConfiguration").getMailerMethod()']
        # при використанні рядків з подвійними лапками, зворотний слеш повинен бути екранований двічі (див. https://yaml.org/spec/1.2/spec.html#id2787109)
        # аргументи: ["@=service('App\\\\Mail\\\\MailerConfiguration').getMailerMethod()"]

Щоб дізнатися більше про синтаксис мови виразів, див. .

У цьому контексті, у вас є доступ до 2 функцій:

service
Повертає даний сервіс (дивіться приклад вище).
parameter
Повертає конкретне значення параметру (синтаксис такий же, як у service).
env
Повертає значення змінної середовища.

6.1

Функція env() була представлена в Symfony 6.1.

Ви також маєте доступ до Container через змінну container. Ось ще один приклад:

  • YAML
  • XML
  • PHP
1
2
3
4
5
# config/services.yaml
services:
    App\Mailer:
        # префікс '@=' обовʼязковий при використанні виразів для аргументів у файлах YAML
        arguments: ["@=container.hasParameter('some_param') ? parameter('some_param') : 'default_value'"]

Виази можуть бути використані в arguments, properties, в якості аргументів з configurator і аргументів до calls (виклики методу), та у factories (фабрики сервісів).

6.1

Використання виразів у factories було представлено у Symfony 6.1.