bad*_*a77 6 events symfony doctrine-orm
我试图在preFlush事件上向实体添加用户实体.基本上每个实体都有一个createdBy,它是一个User实体.
每当我尝试这个时,我收到以下错误.
Notice: Undefined index: 0000000055f036b6000000009c9cc58f in /dir/vendor/doctrine/orm/lib/Doctrine/ORM/UnitOfWork.php line 870
Run Code Online (Sandbox Code Playgroud)
这是我的preFlush功能.
public function preFlush(PreFlushEventArgs $args)
{
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
$securityContext = $this->container->get('security.context');
if($securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED')
|| $securityContext->isGranted('IS_AUTHENTICATED_FULLY'))
{
$user = $securityContext->getToken()->getUser();
}
if(!$user)
{
$user = $em->getRepository('NAB\EnterpriseBundle\Entity\User')->findOneByUsername($this->username);
}
foreach ($uow->getScheduledEntityInsertions() as $entity)
{
$entity->setCreatedBy($user);
$em->persist($user);
}
$meta = $em->getClassMetadata(get_class($entity));
$uow->recomputeSingleEntityChangeSet($meta, $entity);
$uow->computeChangeSets($meta, $entity);
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
您错误地计算了变更集。以下位:
$meta = $em->getClassMetadata(get_class($entity));
$uow->recomputeSingleEntityChangeSet($meta, $entity);
$uow->computeChangeSets($meta, $entity);
Run Code Online (Sandbox Code Playgroud)
仅在检查上下文中的最后一个实体上执行。
您应该将其移至 foreach:
foreach ($uow->getScheduledEntityInsertions() as $entity) {
$entity->setCreatedBy($user);
$em->persist($user);
$meta = $em->getClassMetadata(get_class($entity));
$uow->recomputeSingleEntityChangeSet($meta, $entity);
}
Run Code Online (Sandbox Code Playgroud)
更好的是(因为您不熟悉UnitOfWork
API),您可以仅在最后重新计算所有变更集一次:
foreach ($uow->getScheduledEntityInsertions() as $entity) {
$entity->setCreatedBy($user);
$em->persist($user);
}
$uow->computeChangeSets();
Run Code Online (Sandbox Code Playgroud)
您还应该将此侦听器从 移至preFlush
来onFlush
处理其他侦听器应用的任何更改。