2

我已经使用Doctrine2设置了 ZF2 Skeleton Application 。我的目标是创建具有简单层次结构的简单新闻服务。

  Category -> News -> Media (file)

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

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

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

感觉这是错误的做法

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

4

1 回答 1

3

找到了解决方案。

这很简单:

首先在 Media 类之前添加注解

/**
 * Media
 *
 * @ORM\Table(name="media")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks  <- Add this line
 */
class Media

然后你需要在PreRemovePostRemove上为类添加 2 个函数

/**
 * @ORM\PreRemove()
 */
public function storeFilenameForRemove()
{
    $this->temp = realpath($this->path);
}    

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

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

您还需要定义

private $temp;

那存储文件名。

而已。现在,当您删除新闻或新闻类别时,所有相关的媒体文件都将与它的实体一起删除。

于 2013-07-10T08:39:09.630 回答