Symfony 未触发预更新

Symfony 未触发预更新,symfony,doctrine-orm,Symfony,Doctrine Orm,我的实体中有此方法: /** * @ORM\PreUpdate() * @ORM\PrePersist() */ public function preStore() { if ($this->getPictureFile()) { $newFilename = sha1(mt_rand()); $newFilename = $newFilename . '.' . ($this->

我的实体中有此方法:

/**
     * @ORM\PreUpdate()
     * @ORM\PrePersist()
     */
    public function preStore() {
        if ($this->getPictureFile()) {
            $newFilename = sha1(mt_rand());
            $newFilename = $newFilename . '.' . ($this->getPictureFile()->guessExtension());
            $this->setPictureFilename($newFilename);
        }
    }
当持久化对象时,一切都正常工作,但在更新时,该方法根本不会触发,我以这种方式对其进行了测试:

/**
     * @ORM\PreUpdate()
     * @ORM\PrePersist()
     */
    public function preStore() { var_dump('asdasdasdadsdasdas');
        if ($this->getPictureFile()) {
            $newFilename = sha1(mt_rand());
            $newFilename = $newFilename . '.' . ($this->getPictureFile()->guessExtension());
            $this->setPictureFilename($newFilename);
        }
    }

在持久化var_中,dump是有效的,但当我更新对象时,它就不起作用了。为什么?

您必须明确告诉Dority您的实体有生命周期回调:

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class YourClass
此外,如果不提供任何选项,则注释中不需要尾随的
()

/**
 * @ORM\PrePersist
 * @ORM\PreUpdate
 */
public function preStore()
考虑使用侦听器/订阅者而不是生命周期回调,这样可以更容易地重用并保持实体更干净


更多信息可以在cookbook一章中找到。

只有在实体字段(从条令中观察)发生更改时才会进行更新,因此只有在更改后才会调用preupdate方法

注意:我猜你的图片文件不是一个条令专栏,等等,条令都不看。所以你的实体不会因为教义而改变

来自烹饪书的文章

只有在持久化的实体字段之一发生更改时,才会触发PreUpdate和PostUpdate回调。这意味着,默认情况下,如果只修改$file属性,则不会触发这些事件,因为该属性本身不会通过条令直接持久化。一种解决方案是使用一个持久化到条令的更新字段,并在更改文件时手动修改它


编辑:或者使用

的另一个失败原因是如果您只有一个星号

失败:
/*@ORM\PrePersist*/

成功:
/**@ORM\PrePersist*/


荒谬,但事实就是如此。

我遇到了同样的问题,以下是我的解决方案:


添加一个映射字段
updatedAt
,只需调用
setUpdatedAt(new\DateTime())
在您的
上传文件的
setter
内部
这将触发实体的
预更新事件

如果我没有@ORM\HasLifeCycleCallbacks,那么预写器也不会工作,正如我所说的-它工作得很好。删除尾部()没有改变任何内容。我知道我可以用事件监听器来做,但我想知道为什么它不工作?尾部()与执行
newfoo()时没有什么不同。注释只是以特殊方式调用的类。就像类一样,你可以做
newfoo
,但许多标准,如PSR-12,都说要包含参数,不管你是否有参数,那么很多人也会在注释中包含参数。嗯。。。因此,如果我将“条令”列更改为任何内容,例如“xxx”,那么它终究会起作用,因为条令映射的文件名随后会更改为自动生成的文件名?@PatrikKarishch!!!!!!!!!!!!!!!!!!!!!!!ORM优化和@PreUpdate调用的惊人之处——伟大的postA好的解决方案与@Patrik的答案齐头并进,这解释了为什么这样做有效