April 27, 2017 Javier Eguiluz

In Symfony 3.3, configuring services is much simpler thanks to these new configuration options:

_defaults : defines the default value for the public , tags and autowire options of the services defined in a given file;

: defines the default value for the , and options of the services defined in a given file; _instanceof : defines the default configuration of services depending on their classes (e.g. add the twig.extension tag to any service that implements Twig_ExtensionInterface ).

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 VoterInterface 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 automated _instanceof definitions. Of course we've already enabled this for all the common Symfony services: commands, form types, event subscribers, etc.