Помеченные сервисы и внедрение зависимостей - PullRequest
0 голосов
/ 18 июня 2019

В одном из моих сервисов мне нужен доступ ко всем сервисам, которые реализуют интерфейс, поэтому я определил в 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]);
    }
}

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

enter image description here

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

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

1 Ответ

1 голос
/ 18 июня 2019

Нашел решение сам, для тех, кому интересно. Ошибка связана с неправильным пониманием моих служб Symfony и их имен. Так что если вы определяете сервис с именем, как я, например,

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

, а затем использовать стандартное внедрение зависимостей

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

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

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

report_helper:
    alias: App\Service\ReportHelper
    arguments:
        $xyz: '@other_service'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...