Автоконфигурация службы с использованием атрибутов
Автоконфигурация служб позволяет автоматически применять определенную конфигурацию к вашим службам в зависимости от класса службы. Это полезно, например, для применения определенного тега службы к классам, реализующим некоторый интерфейс (например, когда вы создаете класс, реализующий 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
в ваших текущих приложениях.