2014-12-05 106 views
3

我使用Silex與Doctrine ORM,一切工作正常,但我遇到了一個我無法弄清楚的問題。Silex + Doctrine ORM不會在@MappedSuperclass上設置時觸發事件

我在命名空間Lpdq \ Model \ Entity中有一個實體新聞,它在名稱空間Lpdq \ Model中擴展了另一個新聞類,其中包含一些方法和用於教義的事件/事件前/事件方法。

我的實體新聞

<?php 

namespace Lpdq\Model\Entity; 

/** 
* News 
* 
* @Table(name="news") 
* @Entity(repositoryClass="Lpdq\Model\Entity\Repository\News") 
*/ 
class News extends Lpdq\Model\News{ 
/*some properties/methods*/ 
} 

我的超類新聞

<?php 

namespace Lpdq\Model; 
/** 
* News 
* 
* @MappedSuperclass 
* @HasLifecycleCallbacks 
*/ 
class News{ 

    /** 
    * @PrePersist 
    */ 
    public function prePersist() 
    { 
     $this->setCreated(new \DateTime()); 
     $this->setUpdated(new \DateTime()); 
    } 

    /** 
    * @PreUpdate 
    */ 
    public function preUpdate() 
    { 
     $this->setUpdated(new \DateTime()); 
    } 

    /*...some methods...*/ 
} 

在我的控制,我只是比如我的實體和持久化/沖洗它

<?php 

namespace Lpdq\Controller; 

use Silex\Application; 
use Symfony\Component\HttpFoundation\Request; 
use Lpdq\Model\Entity\News; 

class NewsController { 

    public function addAction(Request $request, Application $app) { 
     $news = new News(); 
     $news->setTitle('test'); 
     /*...*/ 
     $app['orm.em']->persist($news); 
     $app['orm.em']->flush(); 

     /*...*/ 
    } 
} 

我的問題是當我堅持實體時,我的prePersist/preUpdate方法不會被調用。 (所以我得到一個錯誤,因爲創建和更新我的屬性爲null)

如果我把我的實體作爲新聞和HasLifecycleCallbacks放在同一prePersist /更新方法,它們被觸發。

雖然我在這裏,我想知道如果我擴展我的實體的方式,把前/後和其他方法是好的或不好的做法?

回答

0

如果你有多個實體需要相同的一組方法,那麼擁有一個基類新聞是有意義的,如果只有一個實體擴展了類新聞,那麼這是一個矯枉過正的問題,你可以把代碼放在你的實體類本身。

一般模式是,如果你有多個實體,並且他們都已經創建並更新了字段,那麼你應該創建一個基類,所有這些實體都應該擴展它。

您需要註釋HasLifecycleCallbacks才能啓用生命週期回調。如果生命週期事件適用於從基類繼承的所有實體,那麼您應該在基類中放入註釋,否則將其放入單獨的類中。

0

您有Lpdq\Model\Entity\News延伸Lpdq\Model\News這至少是令人困惑的。 您也僅顯示部分實施 - 確保setTitle()實際上更新了用於Doctrine的跟蹤模型屬性以將實例標識爲髒。否則,不會調用刷新事件。