How to Inject Values Based on Complex Expressions ¶
The service container also supports an "expression" that allows you to inject very specific values into a service.
For example, suppose you have a service (not shown here), called App\Mail\MailerConfiguration
,
which has a getMailerMethod()
method on it. This returns a string - like sendmail
based on some configuration.
Suppose that you want to pass the result of this method as a constructor argument
to another service: App\Mailer
. One way to do this is with an expression:
-
YAML
YAML
-
XML
XML
-
PHP
PHP
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()"]
|
To learn more about the expression language syntax, see The Expression Syntax.
In this context, you have access to 3 functions:
service
-
Returns a given service (see the example above).
特定のサービスを返します (上記の例を参照)。
parameter
-
Returns a specific parameter value (syntax is like
service
).特定のパラメーター値を返します (構文はサービスに似ています)。 env
-
Returns the value of an env variable.
環境変数の値を返します。
6.1
The env()
function was introduced in Symfony 6.1.
You also have access to the Container
via a container
variable. Here's another example:
-
YAML
YAML
-
XML
XML
-
PHP
PHP
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'"]
|
Expressions can be used in arguments
, properties
, as arguments with
configurator
, as arguments to calls
(method calls) and in
factories
(service factories).
6.1
Using expressions in factories
was introduced in Symfony 6.1.