【发布时间】:2018-09-22 20:09:13
【问题描述】:
我已阅读有关生命周期事件的文档,以及关于 SO 在生命周期事件期间更改或保留新实体的几个问题。调用EnitityManager::flush() 似乎是个问题。
好的,但是looking carefully at the docs,有一个代码示例在 postPersist 中更改了字段,但没有调用刷新。
我检查过了,建议的更改没有写入数据库。只有被持久化的对象才会收到更改。
<?php
/** @Entity @HasLifecycleCallbacks */
class User
{
// ...
/**
* @Column(type="string", length=255)
*/
public $value;
/** @PostPersist */
public function doStuffOnPostPersist()
{
$this->value = 'changed from postPersist callback!';
}
}
也许应该将此添加到文档中。一开始我被误导了。
然而,当添加 LifecyleEventArgs 参数并刷新包含的 EntityManager 时,它们会被写入 DB:
/** @PostPersist */
public function doStuffOnPostPersist(LifecycleEventArgs $args)
{
$this->value = 'changed from postPersist callback!';
$args->getEntityManager()->flush(); // works in my tests. Is this safe to use ?
}
我不知道如何interpret the docs 在 postPersist 中调用 flush 是否可以。
如您所见,我正在寻找一种可靠的方法来在插入或更新实体后对其执行某种后处理。我必须使用 postPersist,因为我需要自动生成的主键值。
附带问题:如果是,可以刷新,那么我是否也可以在 PostUpdate 中保留其他对象?像这样:
/** @PostPersist */
public function doStuffOnPostPersist(LifecycleEventArgs $args)
{
$this->value = 'changed from postPersist callback!';
$obj = new OtherObject("value " . $this->value);
$args->getEntityManager()->persist($obj);
$args->getEntityManager()->flush(); // works in my tests. Is this safe to use ?
}
侧面问题:我已经尝试了最后一个变体,它似乎有效。但它是否有效,或者我是否可能创建深度递归堆栈?根据文档,postPersist 代码在刷新期间调用,所以如果我在 postPersist 期间调用刷新,我必须小心不要持久化执行相同处理程序的对象,这会导致无限递归.这是正确的吗?
【问题讨论】:
标签: symfony doctrine-orm doctrine