New in Symfony 3.3: Service autoconfiguration
Warning: This post is about an unsupported Symfony version. Some of this information may be out of date. Read the most recent Symfony Docs.
In Symfony 3.3, configuring services is much simpler thanks to these new configuration options:
_defaults: defines the default value for the
autowireoptions of the services defined in a given file;
_instanceof: defines the default configuration of services depending on their classes (e.g. add the
twig.extensiontag to any service that implements
The evolution of this simplification is the new
autoconfigure option, which
is like an automated version of
_instanceof. If enabled, this option adds
some default configuration depending on the class implemented by the service.
Let's suppose that you want to add tags automatically to your security voters:
1 2 3 4 5 6 7 8 9
services: _defaults: autowire: true _instanceof: Symfony\Component\Security\Core\Authorization\Voter\VoterInterface: tags: [security.voter] AppBundle\Security\PostVoter: ~
Now ask yourself: if you are registering a service with a class that implements
VoterInterface, when would you ever not want that to be tagged with
security.voter? In other words, a service implementing
can only be a security voter, unless you are doing some seriously weird things.
The same example using
autoconfigure looks like this:
1 2 3 4 5 6
services: _defaults: autowire: true autoconfigure: true AppBundle\Security\PostVoter: ~
This works because each enabled bundle has the opportunity to add one or more
_instanceof definitions. Of course we've already enabled this for
all the common Symfony services: commands, form types, event subscribers, etc.
Whenever we introduce a new feature to automatize the configuration of services, some developers quickly discredit it for being "magic". For us, "magic" means that something happened without you explicitly asking for it. Magic is bad because it leads to WTF moments and hard-to-debug issues.
However, this feature won't work unless you explicitly include the
autoconfigure option in your configuration file. Besides, it only applies
to the services defined in the same file where you include
so there will be no side-effects. In short, this is not magic, just automation.
Comments are closed.
To ensure that comments stay relevant, they are closed for old posts.