如何为Doctrine 2实体制作onDelete事件?

时间:2014-09-12 17:03:04

标签: doctrine-orm

例如:

我们有实体PhotoGallery和Photo(一对多,cascade = {“persist”,“remove”})。如果用户删除PhotoGallery - 所有照片将自动从数据库中删除。但照片文件未被删除。

如何在实体Photo中制作onDelete功能,在删除实体之前/之后执行,我可以从HDD中删除照片文件?

2 个答案:

答案 0 :(得分:1)

您可以在照片模型中使用Lifecycle events,如下所示。

  1. 在类定义中添加@HasLifecycleCallbacks注释:

    /** @Entity @HasLifecycleCallbacks */
    class Photo{
    
        ....
    
  2. 您可以使用@preRemove@postRemove事件从HDD中删除图片:

    /** @PreRemove */
    public function preRemoveEvent()
    {
        // code to delete the image here
    }  
    
  3. 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