我的自定义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;
}
// ...
}