Теговые сервисы и внедрение зависимостей

В одном из моих сервисов мне нужно получить доступ ко всем сервисам, которые реализуют интерфейс, поэтому я определил в services.yaml:

_instanceof:
    App\ReportPlaceholder\ReportPlaceholderInterface:
        tags: ['app.reportplaceholder']

report_helper:
    class: App\Service\ReportHelper
    public: true
    arguments:
        - $placeholders: !tagged app.reportplaceholder

и соответствующий класс читается:

class ReportHelper
{
    /**
     * @var EntityManagerInterface
     */
    private $entityManager;
    /**
     * @var ReportPlaceholderInterface[]
     */
    public $placeholders;
    /**
     * @var DataEvaluator
     */
    private $dataEvaluator;

    public function __construct(EntityManagerInterface $entityManager,
                                DataEvaluator $dataEvaluator,
                                iterable $placeholders = [])
    {
        $this->entityManager = $entityManager;
        $this->dataEvaluator = $dataEvaluator;

        dump([debug_backtrace(), $this->placeholders = $placeholders]);
    }
}

Странно то, что я всегда получаю сообщения дампа два !!!

Теговые сервисы и внедрение зависимостей

Похоже, служба ReportHelper создается дважды, один раз с помеченными службами и один раз без них.

Глядя на стек вызовов, я вижу, что один раз (с пустым итератором) это /var/www/symfony/var/cache/dev/ContainerAbdE4g8/getReportHelper2Service.php (обратите внимание на «2»), а второй вызов конструктора исходит от диспетчера событий /var/www/symfony/vendor/symfony/event-dispatcher/EventDispatcher.php

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
636
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение нашел сам, кому интересно. Ошибка связана с моим непониманием сервисов symfony и их названий. Итак, если вы определяете службу с именем, как я, например,

report_helper:
    class: App\Service\ReportHelper
    arguments:
        $xyz: '@other_service'

а затем используйте стандартную инъекцию зависимостей

class X {
    public function __construct(ReportHelper $rh){}
}

то это две разные услуги!!! Потому что неявно через автосвязывание создается экземпляр второй сервис по умолчанию с именем App\Service\ReportHelper, который фактически передается X в последнем случае!

Таким образом, заменив class: в моем определении службы на ключевое слово alias:, будет создан только один экземпляр с двумя идентификаторами.

report_helper:
    alias: App\Service\ReportHelper
    arguments:
        $xyz: '@other_service'

Другие вопросы по теме