Doctrine Symfony2预更新/预更新侦听器通知

Doctrine Symfony2预更新/预更新侦听器通知,doctrine,Doctrine,我在使用doctor/Symfony2 prePersist/preUpdate侦听器时遇到问题 多人关系中有两个实体一个位置可以被多人引用。我构建了一个表单,在这里我做了一些AJAX的工作来帮助用户为一个已经存在的新人选择一个位置。因此,我使用的是实体id表单字段。 我还想让用户能够为数据库中不存在的新用户创建一个新位置。这由表单中的第二个字段处理,用户可以在其中插入新位置的名称。 在持久化Person实体时,我检查数据库中是否存在引用的位置。如果没有,我将生成一个新的位置实体。简而言之,这是

我在使用doctor/Symfony2 prePersist/preUpdate侦听器时遇到问题

多人关系中有两个实体一个位置可以被多人引用。我构建了一个表单,在这里我做了一些AJAX的工作来帮助用户为一个已经存在的新人选择一个位置。因此,我使用的是实体id表单字段。 我还想让用户能够为数据库中不存在的新用户创建一个新位置。这由表单中的第二个字段处理,用户可以在其中插入新位置的名称。 在持久化Person实体时,我检查数据库中是否存在引用的位置。如果没有,我将生成一个新的位置实体。简而言之,这是我在实体类Person中的prePersist Lifecyclecallback:

public function prePersist() {
   if($this->ort == null) 
       $this->ort = new Ort($this->ortsname);
}
当我创造一个新的人时,这是完美的。问题在于更新程序。因此,当有一个as位置连接到之前的人时,我想通过与preUpdate侦听器相同的过程创建一个新位置,我会收到如下通知:

Notice: Undefined index: 000000004a0010250000000058426bec in ...Doctrine/ORM/UnitOfWork.php line 983
我不知道如何解决这个问题。我认为这一定是位置对象的某些东西,在引用Person对象之前,但我不知道如何告诉实体经理,引用Person的位置对象是一个新实体。 我还尝试了一个侦听器类,如:

if( $entity instanceof Person) {
    if( $entity->getLocation() == null ) {
         $entity->setLocation( new Location( $entity->getLocatioName() );
         $em->persist($entity->getLocation());
         $em->flush();
    }
}

$em->persist。。。东西应该无关紧要,因为在映射中启用了cascade={persist}表示法。

我认为使用preUpdate会遇到麻烦。有两件事意味着preUpdate不是这种情况下最好的事件处理程序:

刷新操作不再识别对已传递实体的关联所做的更改。 强烈反对对EntityManagerpersist或EntityManagerremove的任何调用,即使与UnitOfWork API结合使用,并且在刷新操作之外也不会按预期工作。 这两点取自本节底部:

此外,在Primy的刷新操作的中间调用预更新,再次调用刷新会引起问题。

因此,我建议您改用onFlush:

如果您这样做,您需要告诉Dority,一旦您将位置添加到Person实体中,Person实体已经更改。获取已更改的Person对象本身也稍微复杂一些。在onFlush处理程序中尝试以下操作:

FlushOnFlushEventArgs$args上的公共函数 { $em=$args->getEntityManager; $uow=$em->getUnitOfWork; foreach$uow->GetScheduleDentityUpdate作为$entity{ 如果$entity instanceof Person{ 如果$entity->getLocation==null{ $entity->setLocation新位置$entity->getLocationName; //必须告诉条令位置已经更新 $cmf=$args->getEntityManager->getMetadataFactory; $class=$cmf->getMetadataForget\u class$entity; $args->getEntityManager->getUnitOfWork->computeChangeSet$class,$entity;//不要在此处使用重新计算SingleEntityChangeSet-这与关系无关 } } } }