2013-07-26 128 views
0

當調用實體BarsetFoo()方法時,我想完成某種邏輯,如從數據庫中獲取對象。我正在考慮創建一個處理這種邏輯的監聽器,但我會優先創建一種實體封裝器或管理器,它會覆蓋方法,並在調用Bar::setFoo()時透明地執行該方法。覆蓋實體設置器

這個想法是以透明的方式覆蓋所提到的方法應用範圍,所以例如當提交表單bind()方法時也會運行覆蓋setFoo()方法而不是Bar::setFoo()

經過一番研究,我發現沒有辦法包裹我的對象覆蓋Bar :: setFoo()。有誰知道我怎麼能聽Bar :: setFoo()的調用?作爲prePersist,postLoad,onFlush等事件偵聽器不是一個有效的解決方案,因爲它們在對象驗證後被調用我正在嘗試使用以下鏈接上公開的解決方案,但經過一些測試後,我認爲他們可以偵聽方法調用除了實體方法,除了實體方法外,http://jmsyst.com/bundles/JMSAopBundle#transaction-management

是否有人知道我該如何實現?

編輯:最後不得不使用Form :: Events與EntityManager一起使用。結果並不像預期的那樣乾淨,而是功能齊全。

+0

使用Doctrine 2? – Cerad

+0

對不起,忘了提及是的我做的。 – user846226

+1

好的。通常你不希望D2對象訪問數據庫。所以我不能真的幫助那裏。但是,既然你提到了表單綁定,我懷疑Symfony 2 DataTransformer可能就是你想要的。也許你可以提供一個你正試圖解決的具體用例,而不是抽象的foo/bar問題。 – Cerad

回答

0

您是否考慮過實施Proxy對象?

class BarProxy extends Bar 
{ 
    private $bar; 

    public function __construct(Bar $bar) 
    { 
     $this->bar = $bar; 
    } 

    // override all Bar methods and delegate to $this->bar->{method}() 

    public function setFoo($foo) 
    { 
     // your logic 
    } 
} 
+0

感謝Bernhard,是否有可能或建議在代理對象內注入實體管理器? – user846226

+0

當然你可以做到這一點。 –