РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
737 of 1361 menu

Атрибут Target

Атрибут Target используется в контейнере внедрения зависимостей Symfony для ограничения области применения сервиса, тега или алиаса. Он вешается на класс сервиса или на метод контроллера и принимает первым параметром имя интерфейса, класса или строковый идентификатор, к которому применяется ограничение. Вторым параметром передаётся имя сервиса, который будет использован для внедрения. Это позволяет гибко управлять тем, какой именно сервис получит зависимость в конкретном случае.

Синтаксис

#[Target(interface, service: serviceName)]

Пример

Давайте ограничим внедрение сервиса LoggerInterface только для класса ArticleController:

<?php namespace AppService; use PsrLogLoggerInterface; use SymfonyComponentDependencyInjectionAttributeTarget; #[Target(ArticleController::class, service: 'monolog.logger.article')] class ArticleLogger implements LoggerInterface { public function log(string $message): void { // implementation } } ?>

В результате выполнения кода сервис ArticleLogger будет внедрён только в ArticleController, а в других контроллерах будет использован стандартный логгер.

Пример

Давайте ограничим применение тега app.handler только для сервисов, реализующих интерфейс HandlerInterface:

<?php namespace AppService; use SymfonyComponentDependencyInjectionAttributeTarget; use AppContractHandlerInterface; #[Target(HandlerInterface::class, service: 'app.handler.article')] class ArticleHandler implements HandlerInterface { public function handle(string $data): string { return 'handled: ' . $data; } } ?>

В результате выполнения кода тег app.handler будет применён только к сервису ArticleHandler, что позволяет избежать конфликтов при компиляции контейнера.

Пример

Давайте применим атрибут Target к методу контроллера для внедрения конкретного сервиса:

<?php namespace AppController; use SymfonyBundleFrameworkBundleControllerAbstractController; use SymfonyComponentHttpFoundationResponse; use SymfonyComponentDependencyInjectionAttributeTarget; use AppServiceArticleLogger; class ArticleController extends AbstractController { #[Target(ArticleLogger::class, service: 'monolog.logger.article')] public function index(ArticleLogger $logger): Response { $logger->log('index page'); return new Response('hello'); } } ?>

Результат выполнения кода для адреса /:

hello

Смотрите также

  • класс Container,
    который управляет сервисами в контейнере
  • атрибут AsAlias,
    который создаёт псевдоним для сервиса
  • атрибут AsDecorator,
    который декорирует существующий сервис
  • атрибут When,
    который задаёт условие для внедрения сервиса
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить