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