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