zend framework 2 + doctrine:删除具有相关实体的媒体

时间:2013-07-09 13:41:02

标签: optimization doctrine-orm entity zend-framework2 media

我已使用 Doctrine2 设置 ZF2 骨架应用程序。我的目标是创建简单层次结构的简单新闻服务。

  Category -> News -> Media (file)

我已经为类别,新闻和媒体设置了所有必需的关系(即如果删除了新闻,则所有相关媒体都会从数据库中删除。)

问题是媒体指向某个文件(位于文件存储中)。我已经实现了简单的功能,删除与新闻相关的所有媒体,然后删除它自己的新闻。

  $news->deleteImg();
  $this->getEntityManager()->remove($news);
  $this->getEntityManager()->flush();

感觉这是错误的方法

有没有办法将删除文件功能绑定到媒体实体,每次直接删除媒体或通过它的父母将自动调用? (即新闻或类别)

1 个答案:

答案 0 :(得分:3)

找到了解决方案。

这很简单:

首先在Media class

之前添加注释
/**
 * Media
 *
 * @ORM\Table(name="media")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks  <- Add this line
 */
class Media

然后你需要在 PreRemove PostRemove

上为课程添加2个功能
/**
 * @ORM\PreRemove()
 */
public function storeFilenameForRemove()
{
    $this->temp = realpath($this->path);
}    

/**
 * @ORM\PostRemove()
 */
public function removeImg()
{
    if (isset($this->temp)) {
        unlink($this->temp);
    }        
}

此函数将被触发:删除之前的第1个(存储文件名)和从DB中删除实体以删除相关文件之后的第二个。

您还需要定义

private $temp;

存储文件名。

就是这样。现在,当您删除新闻或新闻类别时,所有相关的媒体文件将被删除它的实体。