Service Autoconfiguration Using Attributes
Service autoconfiguration allows to automatically apply certain configuration
to your services, based on your service’s class. This is useful for example to
apply certain service tag to classes that implement some interface (e.g. when
you create a class implementing Twig\Extension\AbstractExtension
, Symfony
applies the twig.extension
tag to it so you can use it without configuring it).
PHP attributes are one of the best new features introduced in PHP 8. They allow to add machine-readable metadata to your code. That's why in Symfony 5.3 we've combined both to allow autoconfigure services using PHP attributes.
In previous Symfony versions, you could add the following to your kernel or dependency injection extension:
1 2
$container->registerForAutoconfiguration(SomeInterface::class)
->addTag('app.some_tag');
In Symfony 5.3 you can remove this configuration if you like and use instead the
#[Autoconfigure]
attribute on the PHP interface:
1 2 3 4 5 6 7 8 9 10
# src/SomeNamespace/SomeInterface.php
namespace App\SomeNamespace;
use Symfony\Component\DependencyInjection\Attribute\Autoconfigure;
#[Autoconfigure(tags: ['app.some_tag'])]
interface SomeInterface
{
// ...
}
In addition to tags
, you can autoconfigure other service properties, such as
method calls, service configurators, whether the service is public/shared/lazy, etc.
Autoconfigurable Attributes
A different but related feature introduced in Symfony 5.3 allows you to use PHP attributes to autoconfigure instances of classes instead of interfaces. For example, in previous Symfony applications your configuration had to include the following about controllers:
1 2 3 4 5
# config/services.yaml
App\Controller\:
resource: '../src/Controller/'
tags: ['controller.service_arguments']
# ...
This was necessary to apply the controller.service_arguments
tag to all the
services whose classes where stored in the src/Controller/
directory of your
application (this tag allows autowiring the arguments of all controller methods,
not only its constructor). In Symfony 5.3 you can remove that configuration if
you like and apply instead the following attribute to all your controllers that
need that feature:
1 2 3 4 5 6 7 8
// src/Controller/MyController.php
use Symfony\Component\HttpKernel\Attribute\AsController;
#[AsController]
class MyController
{
// ...
}
These attribute names follow the pattern #[As...]
. Symfony 5.3 provides
#[AsCommand]
to define a PHP class as a Symfony console command,
#[AsEventListener]
to define a PHP class as a Symfony event listener, etc.
Note that you don't need to add these attributes when upgrading to Symfony 5.3.
They are an optional way of achieving the same that you get when using
autoconfigure: true
in config/services.yaml
in your current applications.
Can you do something similar to define aliases? I'd like to declare my service as an alias of an interface without specifying it in services.yaml
@Massimiliano not yet, PR welcome as always ;)
Coool, Thanks