gpt4 book ai didi

symfony - 是否可以在 postPersist 中刷新?

转载 作者:行者123 更新时间:2023-12-03 22:13:52 27 4
gpt4 key购买 nike

我已经阅读了有关生命周期事件的文档,以及关于在生命周期事件期间更改或保留新实体的几个问题。调用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关于是否可以调用 flush在 postPersist 里面。

如您所见,我正在寻找一种可靠的方法来在插入或更新实体后对它们执行某种后处理。我必须使用 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 期间调用刷新,我必须小心不要持久化执行相同处理程序的对象,这会导致无限递归。它是否正确?

最佳答案

I checked that, and the suggested change is not written to the DB. Only the object being persisted does receive the change.

Maybe one should add this to the docs. I was mislead at first.


文档中的代码不会尝试保留 value 属性的这种修改
在数据库中,这就是为什么没有 flush()叫做。这只是一个示例,该值也可以未映射到类 User 的数据库属性。 .

I don't know how to interpret the docs about whether it is OK or not to call flush inside the postPersist.


可以调用 flush()在 PostPersist 生命周期回调上以更改映射属性
你的实体。在您的 PostPersist 回调中,您的实体已经插入到您的数据库中。通过更改属性
值和调用 flush()您的实体将被标记为要更新,因此 PostPersist 事件不会
再次分派(dispatch)(而不是 Pre/PostUpdate 事件将被分派(dispatch))。

Side question: If yes, it is ok to flush, could I then also persist other objects in PostUpdate?


在 PostPersist 事件回调中持久化另一个实体类的新对象也没有问题,
但是如果您尝试在此 PostPersist 回调中保留同一(用户)类的对象,您将拥有一个
无限递归,你很容易理解。

Side-side question: I have tried the last variant, and it seems to work. But is it efficient, or am I possibly creating deep recursion stacks?


正如我之前解释的那样,如果不持久化回调所属的同一类(用户)的对象,则此代码不会创建太深的递归堆栈或无限循环。 flush()将被调用两次。尽管在还必须处理关联时事情可能会变得更加复杂,但在您的示例中不存在这样的问题。

关于symfony - 是否可以在 postPersist 中刷新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52460477/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com