2014-09-12 37 views
0

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

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

我如何在实体照片中删除删除功能,删除实体之前/之后执行的操作,我可以删除硬盘中的照片文件?

回答

1

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

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

    /** @Entity @HasLifecycleCallbacks */ 
    class Photo{ 
    
        .... 
    
  2. 您可以使用,以便在@preRemove@postRemove事件从硬盘中删除图像:

    /** @PreRemove */ 
    public function preRemoveEvent() 
    { 
        // code to delete the image here 
    } 
    

的在生命周期中,EntityManager和UnitOfWork会触发一系列事件其注册实体的时间。说,例如,在执行的EntityManager操作之前触发事件@preRemove

$em->remove($entity); 
$em->flush(); 

最后,我已经看到了你已经宣布的Cascate (one to many, cascade={"persist", "remove"})是应该的。照片现在将从db和hdd中删除。

+0

由于其工作。我已删除实体属性“文件名”中的照片文件名。但是对于删除,我需要获取存在于服务定位器中的照片文件夹的路径。我如何从实体访问服务定位器?可以,如果我会从实体删除照片文件,而不是从存储库等? – 2014-09-12 20:04:08

+0

“服务定位器”是什么意思? – manix 2014-09-12 20:19:47

+0

它是控制器中的$ this-> getServiceLocator() - > get('NAME')。 – 2014-09-13 04:52:09

0

一个非常干净和舒适的方法是使用可上载原则行为扩展。

您可以在文档中找到有关它的一切:

可上传的行为提供了一些工具来管理文件的持久性与原则2,包括自动搬运移动,重命名和删除文件等多种功能的。

特点:

  • 扩展移动,删除和重命名文件,根据配置自动
  • 很多的选项:允许覆盖,追加了一些文件是否存在,文件名发电机,移动后的回调,等等。
  • 它可以扩展为不仅可以上传文件,而且可以来自任何源文件(URL,同一服务器中的另一个文件等)。
  • 验证大小和MIME类型

https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/uploadable.md

+0

为什么在这种情况下使用扩展?原则只需使用几行代码即可本地管理它。 – manix 2014-09-12 19:26:34

+1

因为处理上传的文件并不总是一个简单的情况。这个扩展解决了许多与之相关的其他问题。我并不是说它不能用自定义代码完成(女巫通常不那么干净),我只是推荐考虑这个经过良好尝试的解决方案。 – 2014-09-12 19:51:34