Как внедрять значения, основанные на сложных выражениях
Дата обновления перевода 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 (фабрики сервисов).