2014-12-31 38 views
4

我有一个包含两个生命周期事件方法的事件订户:prePersist和preUpdate。 prePersist之一按预期工作 - 我修改文档,稍后在检索文档时反映这些更改。尽管如此,preUpdate没有按预期工作。这基本上是什么样子:保留对Doctrine的PreUpdate生命周期事件对文档所做的更改

/** 
* Also update the foo code when the bar profile is updated. 
* @param LifecycleEventArgs $args 
*/ 
public function preUpdate(LifecycleEventArgs $args) 
{ 
    $document = $args->getDocument(); 
    if ($document instanceof BarProfile) { 
     $document->setFooCode('Salamanders'); 
    } 
} 

如果我创建一个文档,然后在perPersist功能设置其fooCode为“占位符”,然后当我检索文件后,它fooCode是“占位符”。如果我然后更新它,并再次检索它,那么我希望它的fooCode是'Salamanders'。但是,它仍然是'占位符'。我甚至试过把error_log()的东西放在那里,它会把东西写到日志中,这样我就可以看到这个方法正在执行。

$document->setFooCode()之后,我需要做的第二步是让fooCode的新值保持不变?

+1

阅读细则和示例:http://doctrine-orm.readthedocs.org/en/latest/reference/events.html#preupdate。很多人都被这个问题绊倒了。 – Cerad

+0

我确实读过......但我不明白这是什么意思,直到下面的答案解释它。 – beth

+0

我实际上最终在http://doctrine-mongodb-odm.readthedocs.org/en/latest/reference/events.html#preupdate中使用了解决方案,因为我无法识别我正在更改的属性名称在物体上。 – beth

回答

2

您不能直接在preUpdate事件中修改字段,您必须修改其原始值。不允许更改关联。你必须做的:“在prePersist一个工作正常 - 我修改文档,而当我检索文件的更改后反映”

$eventArgs->setNewValue('fooCode', 'Salamanders'); 

你说

这使我相信你可能不知道持续和更新之间的区别。在Doctrine中,当您第一次创建对象时会出现持久性。当您对已经由Doctrine管理的现有对象进行更改时,会发生更新。很多人对此感到困惑,但在更新现有实体时,不需要拨打persist(),只需拨打flush()即可。例如:

// inserts a new entity into the database 
$document = new Document(); 
$document->setName('My Document'); 

$em->persist($document); 
$em->flush(); 

// retrieves entity from the database, makes a change, then updates the database 
$document = $em->findOneByName('My Document'); 
$document->setFooCode('Salamanders'); 

$em->flush(); 

我鼓励你read the Doctrine documentation喜欢CERAD建议。发挥密切注意下面的语句为preUpdate事件:

  • 更新前的是最严格的使用事件
  • 更改更新实体协会在本次比赛中绝不允许
  • 更改领域的通过的实体不再被冲刷操作识别,使用传递给事件的计算的变更集来修改原始字段值
相关问题