我已使用 Doctrine2 设置了 ZF2 骨架应用程序。我的目标是创建具有简单层次结构的简单新闻服务。
Category -> News -> Media (file)
我已经为类别、新闻和媒体设置了所有必需的关系(即,如果新闻被删除,所有相关媒体都会从数据库中删除)。
问题是媒体指向某个文件(位于文件存储中)。我实现了简单的功能,删除与新闻相关的所有媒体,然后删除新闻本身。
$news->deleteImg();
$this->getEntityManager()->remove($news);
$this->getEntityManager()->flush();
感觉这是错误的方法。
有没有一种方法可以将删除文件函数绑定(bind)到媒体实体,每次直接或通过其父级删除媒体时都会自动调用该函数? (即新闻或类别)
最佳答案
找到解决方案。
这很简单:
首先在Media类之前添加注解
/**
* Media
*
* @ORM\Table(name="media")
* @ORM\Entity
* @ORM\HasLifecycleCallbacks <- Add this line
*/
class Media
然后您需要为类添加 2 个函数 PreRemove 和 PostRemove
/**
* @ORM\PreRemove()
*/
public function storeFilenameForRemove()
{
$this->temp = realpath($this->path);
}
/**
* @ORM\PostRemove()
*/
public function removeImg()
{
if (isset($this->temp)) {
unlink($this->temp);
}
}
此函数将被触发:第一次在删除之前(用于存储文件名),第二次在实体从数据库中删除以删除相关文件之后。
您还需要定义
private $temp;
存储文件名。
就是这样。现在,当您删除新闻或新闻类别时,所有相关媒体文件都将与其实体一起删除。
关于optimization - zend框架2+学说: removing media with related Entity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17549733/