Атрибут Autoconfigure
Атрибут Autoconfigure вешается на класс сервиса и включает для него режим автоматической конфигурации. Это позволяет Symfony автоматически добавлять теги и применять настройки, основываясь на интерфейсах, которые реализует класс, или на его родительских классах. Атрибут принимает один необязательный параметр value, который может быть булевым значением (по умолчанию true) для включения или отключения автоконфигурации.
Синтаксис
#[Autoconfigure(value: bool)]
Пример
Давайте создадим сервис, который реализует интерфейс EventSubscriberInterface, и включим для него автоконфигурацию. Symfony автоматически пометит его тегом kernel.event_subscriber:
<?php
namespace AppEventSubscriber;
use SymfonyComponentEventDispatcherEventSubscriberInterface;
use SymfonyComponentHttpKernelEventRequestEvent;
use SymfonyComponentHttpKernelEventResponseEvent;
use SymfonyComponentDependencyInjectionAttributeAutoconfigure;
#[Autoconfigure]
class ArticleSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
RequestEvent::class => 'onRequest',
ResponseEvent::class => 'onResponse',
];
}
public function onRequest(RequestEvent $event): void
{
// ...
}
public function onResponse(ResponseEvent $event): void
{
// ...
}
}
?>
Теперь Symfony автоматически зарегистрирует этот класс как подписчик на события без необходимости вручную указывать тег в конфигурации.
Пример
Давайте создадим сервис, который реализует интерфейс CommandInterface, и включим для него автоконфигурацию. Symfony автоматически пометит его тегом console.command:
<?php
namespace AppCommand;
use SymfonyComponentConsoleCommandCommand;
use SymfonyComponentConsoleInputInputInterface;
use SymfonyComponentConsoleOutputOutputInterface;
use SymfonyComponentDependencyInjectionAttributeAutoconfigure;
#[Autoconfigure]
class ArticleCommand extends Command
{
protected static $defaultName = 'app:article';
protected function execute(InputInterface $input, OutputInterface $output): int
{
$output->writeln('hello');
return Command::SUCCESS;
}
}
?>
Результат выполнения команды php bin/console app:article:
hello
Пример
Давайте отключим автоконфигурацию для конкретного сервиса, передав в атрибут значение false:
<?php
namespace AppService;
use SymfonyComponentDependencyInjectionAttributeAutoconfigure;
#[Autoconfigure(false)]
class ArticleService
{
public function getText(): string
{
return 'hello';
}
}
?>
В этом случае сервис не будет автоматически конфигурироваться, даже если он реализует интерфейсы, которые обычно добавляют теги.
Смотрите также
-
атрибут
AutoconfigureTag,
который автоматически добавляет тег сервису -
атрибут
Autowire,
который включает автоматическое внедрение зависимостей -
класс
Container,
который управляет сервисами в контейнере -
атрибут
AsAlias,
который задаёт псевдоним для сервиса