我已使用 Doctrine2 设置 ZF2 骨架应用程序。我的目标是创建简单层次结构的简单新闻服务。
Category -> News -> Media (file)
我已经为类别,新闻和媒体设置了所有必需的关系(即如果删除了新闻,则所有相关媒体都会从数据库中删除。)
问题是媒体指向某个文件(位于文件存储中)。我已经实现了简单的功能,删除与新闻相关的所有媒体,然后删除它自己的新闻。
$news->deleteImg();
$this->getEntityManager()->remove($news);
$this->getEntityManager()->flush();
感觉这是错误的方法。
有没有办法将删除文件功能绑定到媒体实体,每次直接删除媒体或通过它的父母将自动调用? (即新闻或类别)
答案 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;
存储文件名。
就是这样。现在,当您删除新闻或新闻类别时,所有相关的媒体文件将被删除它的实体。