Как внедрять значения, основанные на сложных выражениях

Дата обновления перевода 2024-07-27

Как внедрять значения, основанные на сложных выражениях

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

Например, представьте, что у вас есть сервис (здесь не показан), под названием 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()"]

Чтобы узнать больше о синтаксисе языка выражений, см. .

В этом контексте, у вас есть доступ к 3 функциям:

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