PreUpdate未触发

时间:2013-06-29 15:03:20

标签: 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);
        }
    }

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

/**
     * @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工作,但当我更新对象 - 它没有。为什么呢?

4 个答案:

答案 0 :(得分:44)

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

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

来自How to handle File Uploads with Doctrine食谱文章

  

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

编辑:或者您使用Uploadable behaviordoctrine extensions

答案 1 :(得分:7)

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

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class YourClass

如果你没有提供任何选项,你的注释中不需要跟踪()

/**
 * @ORM\PrePersist
 * @ORM\PreUpdate
 */
public function preStore()

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

更多信息可以在食谱章节How to Register Event Listeners and Subscribers中找到。

答案 2 :(得分:3)

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

添加一个映射的字段updatedAt,只需在setUpdatedAt(new \DateTime())的{​​{1}}内调用setter,这将触发实体的UploadedFile

答案 3 :(得分:0)

如果您只有一个星号

,则可能失败的另一个原因

失败: /* @ORM\PrePersist */

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

荒谬,但它就是......