Symfony1 在Symfony/doctor中删除记录时执行一些清理

Symfony1 在Symfony/doctor中删除记录时执行一些清理,symfony1,doctrine,Symfony1,Doctrine,将Symfony 1.4.5与条令一起使用 我有一个模型,其中包括一个上传的图像作为列之一-创建和更新记录很好(使用doSave()方法处理上传和对文件的任何更改) 我遇到的问题是,如果记录被删除,我希望它也删除关联的文件。但是,经过几个小时的文档和谷歌搜索,我找不到任何方法来做这件事 有没有办法指定某种删除后代码?我上次使用Doctrine已经有一段时间了,但我似乎记得有一个删除后钩子函数可以用于此类操作。如果您查看信条基类的源代码,您应该能够找到确切的方法名称和用法 EDIT:方法为post

将Symfony 1.4.5与条令一起使用

我有一个模型,其中包括一个上传的图像作为列之一-创建和更新记录很好(使用doSave()方法处理上传和对文件的任何更改)

我遇到的问题是,如果记录被删除,我希望它也删除关联的文件。但是,经过几个小时的文档和谷歌搜索,我找不到任何方法来做这件事


有没有办法指定某种删除后代码?

我上次使用Doctrine已经有一段时间了,但我似乎记得有一个删除后钩子函数可以用于此类操作。如果您查看信条基类的源代码,您应该能够找到确切的方法名称和用法

EDIT:方法为
postDelete()
,可在
doctor\u记录中找到


下面是Symfony文档中的一节,它涵盖了。

劫持Sponsz上校的答案,
postDelete()
方法无疑是一条出路+但是,您需要在
config/ProjectConfiguration.class.php
中启用条令回调。添加此方法:

public function configureDoctrine(Doctrine_Manager $manager)
{
  $manager->setAttribute(Doctrine_Core::ATTR_USE_DQL_CALLBACKS, true);
}
清除Symfony缓存,Doctrine将在适当的时间触发回调方法,如
postDelete()

最终解决方案:

在/lib/model/doctrine/Image.class.php中

class Image extends BaseImage
{
  public function postDelete()
  {
    $filename = $this->getFilename();

    $filepath = sfConfig::get('sf_upload_dir') . '/' . $filename;
    @unlink($filepath);
  }
}

感谢斯波茨上校为我指明了正确的方向

事实上,这一页没有足够的细节,而且条令API也同样无用。当您在模型类中创建postDelete()方法时会发生什么?你能用它来采取行动吗?哪怕只是记录一条消息?我可以让postDelete()方法中的代码运行,没问题-但我不知道如何获取需要删除的图像的文件名…再说一遍,我不确定它如何与Doctrine一起工作,但是,即使数据已从数据库中删除,该类仍然与所有字段值一起存在。其中一个听起来像是文件名,因此您可以在postDelete()方法中引用它。一个起点是尝试在postDelete()方法中记录record类中的filename字段,如果您可以这样做,那么您就可以执行删除操作。感谢您提供的额外信息,尽管我认为它已经按照我在postDelete方法中添加回显时的顺序进行了排序,我不必显式地将其添加到配置中,就可以获得预期的输出。实际上,在使用DQL回调(preDqlSelect、preDqlUpdate和preDqlDelete)时,您只需添加此配置。啊,我的错误-我似乎永远无法让post*方法在没有此功能的情况下工作。也许这是我的信条1.0天的宿醉…:-)您也可以使用条令事件处理它,但对于删除特定于记录的文件这样的简单操作,您的解决方案很好,我阅读了事件/侦听器-如果我开始得到一个笨拙的postDelete过程,我可能会切换到这个过程。我正在这样做,但遇到了一个问题:如果删除失败,事务从未提交,postDelete方法仍会运行,文件也会被删除。