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

Дата оновлення перекладу 2024-06-03

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

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

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

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

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
Повертає значення змінної середовища.

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

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 (фабрики сервісів).