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




Решение нашел сам, кому интересно. Ошибка связана с моим непониманием сервисов 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'