Новое в Symfony 5.3: Автоконфигурация сервиса и атрибуты

Автоконфигурация службы с использованием атрибутов

Автоконфигурация служб позволяет автоматически применять определенную конфигурацию к вашим службам в зависимости от класса службы. Это полезно, например, для применения определенного тега службы к классам, реализующим некоторый интерфейс (например, когда вы создаете класс, реализующий Twig\Extension\AbstractExtension, Symfony применяет к нему тег twig.extension, чтобы вы могли использовать его без его настройки).

Атрибуты PHP – одна из лучших новых функций, представленных в PHP 8. Они позволяют добавлять машиночитаемые метаданные в ваш код. Вот почему в Symfony 5.3 объединили оба, чтобы разрешить автоконфигурацию сервисов с использованием атрибутов PHP.

В предыдущих версиях Symfony вы могли добавить в свое ядро или расширение внедрения зависимостей следующее:

$container->registerForAutoconfiguration(SomeInterface::class)
    ->addTag('app.some_tag');

В Symfony 5.3 вы можете удалить эту конфигурацию, если хотите, и использовать вместо этого атрибут #[Autoconfigure] в интерфейсе PHP:

# src/SomeNamespace/SomeInterface.php
namespace App\SomeNamespace;

use Symfony\Component\DependencyInjection\Attribute\Autoconfigure;

#[Autoconfigure(tags: ['app.some_tag'])]
interface SomeInterface
{
    // ...
}

Помимо тегов, вы можете автоматически настраивать другие свойства службы, такие как вызовы методов, конфигураторы служб, является ли служба public/shared/lazy и т. д.

Автоконфигурируемые атрибуты

Другая, но связанная функция, представленная в Symfony 5.3, позволяет вам использовать атрибуты PHP для автоконфигурирования экземпляров классов вместо интерфейсов. Например, в предыдущих приложениях Symfony ваша конфигурация должна была включать следующее о контроллерах:

# config/services.yaml
App\Controller\:
    resource: '../src/Controller/'
    tags: ['controller.service_arguments']
# ...

Это было необходимо для применения тега controller.service_arguments ко всем службам, классы которых хранятся в каталоге src/Controller/ вашего приложения (этот тег позволяет автоматически подключать аргументы всех методов контроллера, а не только его конструктора). В Symfony 5.3 вы можете удалить эту конфигурацию, если хотите, и вместо этого применить следующий атрибут ко всем вашим контроллерам, которым нужна эта функция:

// src/Controller/MyController.php
use Symfony\Component\HttpKernel\Attribute\AsController;

#[AsController]
class MyController
{
    // ...
}

Эти имена атрибутов следуют шаблону #[As…]. Symfony 5.3 предоставляет #[AsCommand] для определения класса PHP как консольной команды Symfony, #[AsEventListener] для определения класса PHP как слушателя событий Symfony и т. д. Обратите внимание, что вам не нужно добавлять эти атрибуты при обновлении до Symfony 5.3. Это необязательный способ достижения того же, что вы получаете при использовании autoconfigure: true в config/services.yaml в ваших текущих приложениях.