Как инжектить класс из одного бандла внутри сервиса другого бандла?

У меня существует два кастомных бандла симфони, оба подключаются к основному проекту, и как проект, так и один из бандлов используют методы второго бандла. Первый бандл это мессенджер, второй - логгер, соответственно методы логгера используются в мессенджере. При попытке в сервисе мессенджера сделать следующее:

public function __construct(string $apiUrl, LogService $logger)

получаю ошибку

Too few arguments to function Acme\NotifierBundle\Service\NotificationService::__construct(), 1 passed in /var/cache/dev/Container51Q3Syr/getAppControllerService.php on line 26 and exactly 2 expected

Если правильно понимаю, первый аргумент приходит нормально из .yaml, а второй нет.

Оба бандла конфигурируются своими ямлами. Как здесь правильно поступить, что необходимо сделать, чтобы не делать new LogService::class, а именно передавать LogService как аргумент в __construct()?


Ответы (1 шт):

Автор решения: Денис Нестерюк

Попробуйте так: для LogService в файле сервисов приложения задать алиас(эдакий мост)

#config/services.yaml
services:
   
   my.logger: '@неймспейс\LogService'

а в конфигурации бандла, в сервисе где этот логгер инжектится явно указать:

#bundle/Resources/config/services.yaml

services:
   
   first_bundle_service:
       class: Неймспейс\Класс
       arguments:
          $apiUrl: 'https://url...'
          $logger: '@my.logger'

PS: ну и желательно не использовать в бандле такую жесткую зависимость от LoggerService, а сделать так, например, чтобы LoggerService реализовывал бы Psr\Log\LoggerInterface (psr-3) и в зависимостях указывать этот интерфейс.

→ Ссылка