PreUpdate未触发

use*_*156 14 symfony doctrine-orm

我在我的实体中有这个方法:

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

当持久化对象时,一切都运行得很完美但是在更新时根本没有触发方法,我测试了这样:

/**
     * @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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

并且在持久化var_dump工作,但当我更新对象 - 它没有.为什么?

Emi*_*aos 47

仅当实体字段(从doctrine中观察)发生更改时才会发生更新,因此仅在更改后调用preupdate方法.

警告:我猜你的图片文件不是教条专栏,所以没有被学说观察.因此,您的实体不会因​​学说而改变.

如何使用Doctrine cookbook文章处理文件上载

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

编辑:或者你使用可上传行为中的理论扩展


Nic*_*ich 7

你必须明确地告诉学说你的实体有生命周期回调:

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class YourClass
Run Code Online (Sandbox Code Playgroud)

此外,()如果您不提供任何选项,则不需要在注释中添加尾随.

/**
 * @ORM\PrePersist
 * @ORM\PreUpdate
 */
public function preStore()
Run Code Online (Sandbox Code Playgroud)

考虑使用侦听器/订户而不是生命周期回调,以便更轻松地重用并保持实体更清洁.

更多信息可以在食谱章节如何注册事件监听器和订阅者中找到.

  • 如果我没有@ORM\HasLifeCycleCallbacks那么prepersist也不会工作,正如我所说 - 它完美无缺.删除trailing()并没有改变任何东西.我知道我可以用事件监听器来做,但我想知道它为什么不起作用? (2认同)