New in Symfony 6.1: Service Autowiring Attributes


Contributed by
Kevin Bond

in #45657
and #45783.

PHP attributes are arguably one of the new PHP features with more positive
impact on how we develop applications. Attributes add structured, machine-readable
metadata information in code. In Symfony we added support for them in:

New in Symfony 5.2: Routing PHP attributes
New in Symfony 5.2: Constraints as PHP attributes
New in Symfony 5.2: Controller argument attributes
New in Symfony 5.3: Service Autoconfiguration attributes
New in Symfony 5.3: Autowiring Iterators/Locators and Aliases with Attributes
New in Symfony 6.1: Service Decoration Attributes

In Symfony 6.1 we’re introducing another feature related to attributes so you
can configure service autowiring with PHP attributes. In practice, this
means that you can optionally not add any YAML/XML/PHP service configuration in
config/ and configure your services directly in your code stored in src/.

To do so, use the new #[Autowire] attribute in the constructor arguments of
your services (or in the arguments of any controller method):

use SymfonyComponentDependencyInjectionAttributeAutowire;

class MyService
{
public function __construct(
#[Autowire(service: ’some_service‘)]
private $service1,

#[Autowire(expression: ’service(„App\Mail\MailerConfiguration“).getMailerMethod()‘)
private $service2,

#[Autowire(value: ‚%env(json:file:resolve:AUTH_FILE)%‘)]
private $parameter1,

#[Autowire(value: ‚%kernel.project_dir%/config/dir‘)]
private $parameter2,
) {}

// …
}

In addition to the named arguments (service:, expression:, value:)
you can also use the well-known service syntax used in Symfony’s YAML config
(@ for services and @= for expressions):

use SymfonyComponentDependencyInjectionAttributeAutowire;

class MyService
{
public function __construct(
#[Autowire(‚@some_service‘)]
private $service1,

#[Autowire(‚@=service(„App\Mail\MailerConfiguration“).getMailerMethod()‘)
private $service2,

#[Autowire(‚%env(json:file:resolve:AUTH_FILE)%‘)]
private $parameter1,
) {}

// …
}

Sponsor the Symfony project.

Symfony Blog
Read More

Generated by Feedzy