我的实体中有这个方法:
/**
* @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工作,但当我更新对象 - 它没有。为什么呢?
答案 0 :(得分:44)
只有在实体字段(从doctrine中观察)发生更改时才会发生更新,因此仅在更改后调用preupdate方法。
警告:我猜你的图片文件不是教条专栏,所以没有被学说观看。因此,您的实体不会因学说而改变。
来自How to handle File Uploads with Doctrine食谱文章
PreUpdate和PostUpdate回调只有在其中一个持久化的实体字段发生更改时才会触发。这意味着,默认情况下,如果仅修改$ file属性,则不会触发这些事件,因为属性本身不会通过Doctrine直接保留。一种解决方案是使用已保存到Doctrine的更新字段,并在更改文件时手动修改它。
答案 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 */
荒谬,但它就是......