例如:
我们有实体PhotoGallery和Photo(一对多,cascade = {“persist”,“remove”})。如果用户删除PhotoGallery - 所有照片将自动从数据库中删除。但照片文件未被删除。
如何在实体Photo中制作onDelete功能,在删除实体之前/之后执行,我可以从HDD中删除照片文件?
答案 0 :(得分:1)
您可以在照片模型中使用Lifecycle events,如下所示。
在类定义中添加@HasLifecycleCallbacks
注释:
/** @Entity @HasLifecycleCallbacks */
class Photo{
....
您可以使用@preRemove
或@postRemove
事件从HDD中删除图片:
/** @PreRemove */
public function preRemoveEvent()
{
// code to delete the image here
}
EntityManager和UnitOfWork在其注册实体的生命周期内触发一系列事件。例如,在执行EntityManager操作之前触发@preRemove
事件:
$em->remove($entity);
$em->flush();
最后,我已经看到你已经宣布了级联(one to many, cascade={"persist", "remove"})
。现在这张照片将从db和hdd中删除。
答案 1 :(得分:0)
非常干净和舒适的方法是使用可上载的Doctrine行为扩展。
您可以在文档中找到有关它的所有内容:
可上载行为提供了使用Doctrine 2管理文件持久性的工具,包括自动处理文件的移动,重命名和删除以及其他功能。
特点:
- 扩展程序根据配置自动移动,删除和重命名文件
- 许多选项:允许覆盖,如果文件存在,附加一个数字,文件名生成器,移动后回调等等。
- 它不仅可以扩展到上传文件,还可以扩展到来自任何来源的文件(URL,同一服务器中的另一个文件等)。
- 验证大小和哑剧类型
https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/uploadable.md