New in Symfony 6.1: Expressions as Service Factories


Contributed by
Nicolas Grekas

in #45512.

The service container provided by the DependencyInjection component allows
you to configure the creation of objects. However, sometimes you need to apply
the factory design pattern to delegate the object creation to some special
object called „the factory“.

In Symfony 6.1 we’re improving the service container to allow you to
use expressions as service factories. This can help you in advanced cases
such as selecting the factory based on the value of an environment variable.

The syntax to use depends on the configuration format:

in YAML: factory: ‚@=service(„foo“).bar()‘
in XML: <factory expression=“service(‚foo‘).bar()“ />
in PHP: ->factory(expr(’service(„foo“).bar()‘))

The following example shows how to select the factory to use based on the value
of a configuration parameter:

# config/services.yaml
services:
AppMailer:
factory: „@=parameter(’some_param‘) ? service(’some_service‘) : arg(0)“
arguments:
‚@some_other_service‘

The arg() function returns the value of arguments passed to the factory (e.g.
arg(0) returns the first argument, arg(1) returns the second argument, etc.)

Sponsor the Symfony project.

Symfony Blog
Read More

Generated by Feedzy