Атрибут 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,
который задаёт условие для внедрения сервиса