教义2 PrePersist不会开火

Tom*_*Tom 21 php doctrine doctrine-orm

在同一个实体中,我有一个PreUpdate和一个PrePersist.触发PreUpdate,但PrePersist永远不会发生.我die()在生命周期回调中放了一个flush和注释.完整的实体可以在http://pastebin.com/yUk1u4GQ上看到

实体回调

/**
* @PreUpdate
*/
public function fixDates(){
    $this->updatedOn = $this->getNow();
    $this->closedDate = null;
    $this->openDate = null;
    print "dates fixed";
}

/**
* @PrePersist
*/
public function prePersist() {
    print 'in prePersist';
    die();
}
Run Code Online (Sandbox Code Playgroud)

实体经理致电

$em->persist($school);

$em->flush();
die();
Run Code Online (Sandbox Code Playgroud)

我的屏幕显示"已修复日期",但不是prePersist消息.我确实拥有@HasLifecycleCallbacks该实体的顶部.

Thi*_*uin 57

不要忘记在类注释中启用Lifecycle Callback:

/**
 * Report\MainBundle\Entity\Serveur
 * @ORM\HasLifecycleCallbacks
 */
class Serveur {
Run Code Online (Sandbox Code Playgroud)


Joh*_*han 36

只有在执行INSERT声明而不是UPDATE声明时才会触发PrePersist .

在测试时,不要忘记UPDATE只有在实体属性真正发生变化时才会触发该语句.如果正在调用实体管理器以持久保存该实体,则它首先查看是否存在任何更改.如果不是,则不执行sql查询,也不@PreUpdate调用任何方法.


小智 11

我知道这个问题差不多已经有两年了,但我只是遇到了完全相同的问题,因为我没有接受的答案,我想分享其他人忘记提及的最后一件事.

虽然看起来触发的方法只能由实体类本身使用,但它的范围应该保持公开.我的方法不是因为我将其标记为受保护的方法而触发的.我希望这会对某人有所帮助.


Bes*_*nik 5

我刚遇到同样的问题.希望这可以帮助你:

我忘了使用use语句导入注释.如果你试试这个,别忘了添加"ORM"前缀:

use Doctrine\ORM\Mapping as ORM;

// ...

/**
* @ORM\PreUpdate
*/
public function preUpdate()
{
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*sej 5

也许它依赖于版本,但我的工作注释有下一个视图:

生命周期类注释:

/**
 * @Entity @Table(name="table_name")
 * @HasLifecycleCallbacks
 **/
Run Code Online (Sandbox Code Playgroud)

事件注释:

/** @PrePersist **/
/** @PreUpdate **/
Run Code Online (Sandbox Code Playgroud)

这就是我在模型中拥有的全部内容。