我有两个服务,这些服务通过构造函数注入了Doctrine。当在EventListener中加载实体并为其提供服务时,该实体将被分离。
当我从事件监听器向服务提供DoctrineEntityManager时,仍将管理实体。
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
}
}
服务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在这里创建实体管理器接口的第二个实例,但是说每个项目只有一个实例(https://symfony.com/doc/current/service_container/shared.html)
已通过更新所有软件包(composer update)解决了; D