2013-07-09 87 views
1

我已經設置ZF2骨架應用程序與Doctrine2。我的目標是用簡單的層次結構創建簡單的新聞服務。zend框架2 +原則:移除與相關實體的媒體

Category -> News -> Media (file) 

我設置的類別所需的所有關係,新聞與媒體(即如果消息被刪除所有相關媒體從數據庫中刪除)。

問題是媒體指向某個文件(位於文件存儲中)。我已經實現了簡單的功能,刪除所有與新聞有關的媒體,然後自己新聞。

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

感覺,這是錯誤的做法

有沒有辦法將刪除文件功能綁定到媒體實體每次直接刪除媒體或通過它的父母刪除媒體將自動調用? (即新聞或類別)

回答

2

找到解決方案。

這很簡單:

第一媒體課前添加註釋

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

然後,你需要在刪除前加2種功能的類刪除後

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

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

這個函數會被觸發:刪除前的第1個(用於存儲文件名) d從數據庫中刪除實體以刪除相關文件後第二秒。

你也需要定義

private $temp; 

存儲文件名。

就是這樣。現在當你刪除新聞或新聞類別時,所有相關的媒體文件將被刪除。