Инъекции зависимостей, кажется, создают новый экземпляр доктрины, который приводит к отсоединению сущности) - PullRequest
0 голосов
/ 06 октября 2019

У меня есть две службы, которые вводят 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)

1 Ответ

0 голосов
/ 10 ноября 2019

Исправлено обновлением всех пакетов (обновление композитора) yay; D

...