如何根據複雜運算式注入數值
服務容器也支援「運算式」,讓您可以將非常特定的數值注入到服務中。
例如,假設您有一個名為 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:
# the '@=' prefix is required when using expressions for arguments in YAML files
arguments: ['@=service("App\\Mail\\MailerConfiguration").getMailerMethod()']
# when using double-quoted strings, the backslash needs to be escaped twice (see https://yaml.org/spec/1.2/spec.html#id2787109)
# arguments: ["@=service('App\\\\Mail\\\\MailerConfiguration').getMailerMethod()"]
深入瞭解運算式語言語法。
在此上下文中,您可以存取 3 個函式
service
- 傳回給定的服務(請參閱上面的範例)。
parameter
- 傳回特定的參數值(語法類似
service
)。 env
- 傳回環境變數的值。
您也可以透過 container
變數存取 容器。以下是另一個範例
1 2 3 4 5
# config/services.yaml
services:
App\Mailer:
# the '@=' prefix is required when using expressions for arguments in YAML files
arguments: ["@=container.hasParameter('some_param') ? parameter('some_param') : 'default_value'"]
運算式可以用於 arguments
、properties
、作為 configurator
的引數、calls
(方法呼叫) 的引數,以及 factories
(服務工廠)。
這份作品,包括程式碼範例,以 Creative Commons BY-SA 3.0 授權條款授權。