【问题标题】:Dependency Injections seems to create new doctrine instance, which causes an entity to be detached)依赖注入似乎创建了新的学说实例,导致实体分离)
【发布时间】: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


【解决方案1】:

已通过更新所有包(作曲家更新)修复,耶 ;D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    相关资源
    最近更新 更多