Symfony News

New in Symfony 6.1: Expressions as Service Factories

Nicolas Grekas

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:
    App\Mailer:
        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.


About us

What a Symfony developer should know about the framework: News, Jobs, Tweets, Events, Videos,...

Resources

Find us on Twitter

Find us on Facebook