【发布时间】:2019-10-06 11:42:50
【问题描述】:
我有两个服务,通过构造函数注入 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
}
}
服务 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 在这里创建了 entitymanagerinterface 的第二个实例,但是说每个项目只有一个实例 (https://symfony.com/doc/current/service_container/shared.html)
【问题讨论】:
-
听起来确实很奇怪,而且通常不符合我迄今为止在 symfony 中使用 DI 的任何经验。 tbh,我怀疑某处发生了一些可疑的事情,但无法指出在哪里,因为您的代码显然不完整。但我想 services.yaml 将是一个不错的起点。
-
@Jakumi 谢谢你的回复,我也一样,这就是我创建这个帖子的原因。关于 EM,只有冲洗,没有清洁或其他东西。我已将服务 yaml 添加到线程中。
-
好的,没有什么特别可疑的地方。让我们尝试一下 Windows 解决方案,然后将其关闭再打开,这意味着......废弃供应商目录,作曲家安装(我相信也会清除缓存)
-
也许现在还为时过早,但我不知道您在听哪个活动。无论如何(哈哈) $event->getEntityManager() 会给你实际的事件管理器。使用它可能会或可能不会帮助解决问题。
标签: symfony dependency-injection doctrine symfony4