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