У меня есть две службы, которые вводят Doctrine через конструктор. При загрузке сущности в EventListener и предоставлении ей службы, сущность отсоединяется.
Когда я предоставляю DoctrineEntityManager из EventListener в службу, сущность по-прежнему управляется.
class Listener implements EventSubscriberInterface
{
/** @var EntityManagerInterface */
private $em;
/** @var Service */
private $service;
/** @var EventDispatcherInterface */
private $eventDispatcher;
public function __construct(
EntityManagerInterface $em,
Service $service,
EventDispatcherInterface $eventDispatcher
) {
$this->em = $em;
$this->eventDispatcher = $eventDispatcher;
$this->service = $service;
}
public function listenerFunction(Event $event)
{
$user = $event->getEntity()->getUser();
var_dump($this->em->contains($user)); // true
$this->service->func($this->em, $user);
}
}
class Service
{
/** @var EventDispatcherInterface */
private $eventDispatcher;
public function __construct(EntityManagerInterface $em, EventDispatcherInterface $eventDispatcher)
{
$this->em = $em;
$this->eventDispatcher = $eventDispatcher;
}
public function func($em, $user)
{
var_dump($this->em->contains($user)); // false
var_dump($em->contains($user)); // true
}
}
services yaml
services:
_defaults:
autowire: true
autoconfigure: true
public: true
App\Payment\Command\:
resource: "%kernel.project_dir%/src/Payment/Command/*"
tags:
- { name: console.command }
App\Payment\Service\:
resource: "%kernel.project_dir%/src/Payment/Service/*"
App\Payment\Controller\:
resource: "%kernel.project_dir%/src/Payment/Controller/*"
App\Payment\EventSubscriber\:
resource: "%kernel.project_dir%/src/Payment/EventSubscriber/*"
tags:
- { name: kernel.event_subscriber }
EntityManager в сервисе должен содержать сущность $ user. Я думаю, что Symfony создает здесь второй экземпляр интерфейса entitymanager, но говорит, что существует только один экземпляр каждого элемента (https://symfony.com/doc/current/service_container/shared.html)