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的更新字段,并在更改文件时手动修改它.
你必须明确地告诉学说你的实体有生命周期回调:
/**
* @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)
考虑使用侦听器/订户而不是生命周期回调,以便更轻松地重用并保持实体更清洁.
更多信息可以在食谱章节如何注册事件监听器和订阅者中找到.
| 归档时间: |
|
| 查看次数: |
14233 次 |
| 最近记录: |