为什么我的学说自定义回购会认为我的实体被脱离了



我的自定义Doctrine2存储库有一个奇怪的问题。

我有一个删除控制器,看起来基本上是这样:

public function deleteAction(MyEntity $myEntity, MyEntityRepository $myEntityRepository)
{
    $myEntityRepository->remove($myEntity);
    $myEntityRepository->flushEntityManager();
    return new JsonResponse(['message' => 'Bye bye!']);
}

和存储库的删除方法看起来像:

public function remove(MyEntity $entity): MyEntityRepository
{
    $this->getEntityManager()->remove($entity);
    return $this;
}

这已经有效了,但是现在,我有一个例外:

独立实体appbundle Entity myentity@000000003B458C32000000000000007FD2994A无法删除

我真的不知道,为什么存储库中的实体管理员认为实体被超越。当我将EntityManager直接注入我的控制器时,一切都可以:

public function deleteAction(MyEntity $myEntity, EntityManagerInterface $em)
{
    $em->remove($myEntity);
    $em->flush();
    return new JsonResponse(['message' => 'Bye bye!']);
}

对此有什么想法吗?为什么我从学说 orm entityrepository-> getentityManager()与注入我的控制器的一个不同的EntityManager?

P.S。我的其他删除行动没有这个问题,他们都使用了相同的自定义存储库。这让我发疯。

编辑:在存储库中倾倒$this->getEntityManager()提出:

EntityManager {#627 ▼
-config: Configuration {#461 ▶}
-conn: Connection {#471 ▶}
-metadataFactory: ClassMetadataFactory {#618 ▶}
-unitOfWork: UnitOfWork {#493 ▶}
-eventManager: ContainerAwareEventManager {#511 ▶}
-proxyFactory: ProxyFactory {#588 ▶}
-repositoryFactory: DefaultRepositoryFactory {#619 ▶}
-expressionBuilder: null
-closed: false
-filterCollection: FilterCollection {#598 ▶}
-cache: null
}

在控制器中倾倒$em时会出现

DoctrineORMEntityManager_00000000644c03b80000000000dac8cc6811571fd60520ff7ea135d840b51abe {#410 ▼
-valueHolder59cfe1676bb7b138763071: EntityManager {#664 …11}
-initializer59cfe1676bb84613288121: null
}

我创建了一个新的空符号项目,以逐步重现问题。当我实施实体侦听器时,我遇到了同样的错误,该侦听器的辅助类别本身具有MyentityRepository作为依赖关系。删除此依赖性消除了独立实体的问题。

我意识到,

后来进行了一些进一步的调查,注入的实体实例有时是新实例。为了获取主要实例(并顺便删除循环参考错误),您可以将实体侦听器服务标记为懒惰:

AppBundleEventListenerMyEntityListener:
    autowire: true
    autoconfigure: true
    # the service must be public, when it's tagged lazy
    public: true
    tags:
        - { name: doctrine.orm.entity_listener, lazy: true }

这个懒惰的东西解决了我的问题!

,但我仍然不明白,为什么我会在另一个服务中注入此存储库时将EntityManager的另一个实例注入我的存储库。

在记录中,myentityRepository配置:

AppBundleEntityRepositoryMyEntityRepository:
    autowire: false
    autoconfigure: true
    public: false
    factory: ['@doctrine.orm.default_entity_manager', getRepository]
    arguments:
        - AppBundleEntityMyEntity

Listerner服务:

class MyEntityListener
{
    /** @var MyEntityHelper */
    protected $myEntityHelper;
    public function __construct(MyEntityHelper $myEntityHelper)
    {
        $this->myEntityHelper = $myEntityHelper;
    }
    // ...
}

和助手服务:

class MyEntityHelper
{
    /** @var MyEntityRepository */
    protected $myEntityRepository;
    // this injection of MyEntityRepository creates the problem
    // with the two instances of the EntityManager
    // unless the MyEntityListener is tagged as lazy
    public function __construct(MyEntityRepository $myEntityRepository)
    {
        $this->myEntityRepository = $myEntityRepository;
    }
    // ...
}

相关内容

  • 没有找到相关文章

最新更新