2012-04-18 30 views
0

假設我正在寫一個博客應用程序:我的Posts實體應該有一個createddate,modifieddate,nameslug屬性(當我調用實體的setName()時會生成slu))。我想重複使用此代碼,但我也想重複使用按需。例如,我可能有一個Log實體,它想要使用createddate,但不是modifieddateslug功能。如何重用Doctrine 2實體中的列和事件?

類繼承,無論是通過traits(混入)或抽象類,似乎是不充分的,或至少不正確的,方法來重用此功能,因爲它不通過是-一個測試。畢竟,實體has-a createddate,但不是一個createddate本身..所以我們應該使用組合而不是繼承,對吧?然而,observer在這裏似乎不起作用,因爲雖然我想要使用此功能按需,但Doctrine使用註解和對象屬性似乎會在不使用Reflection的情況下使水平注入變得困難(並且很昂貴?)。

爲了顯示一些代碼並簡化了一下問題:我可以在不破壞DRY或良好的OOP(正確使用組合/繼承)實踐的情況下,將下列定義和功能注入實體嗎?

/** 
* @var DateTime $createddate 
* 
* @ORM\Column(type="datetime") 
*/ 
private $createddate; 

/** 
    * @ORM\PrePersist 
    */ 
public function createddatePrePersist() { 
    $this->createddate = new \DateTime('now'); 
} 

回答

4

我的個人意見是,你正在試圖找到你的錘子釘。你不需要擁有爲每個實體使用組合,繼承,特徵或任何OOP模式。

我傾向於認爲creationDate是我的實體的固有屬性,任何需要創建日期的實體都具有此屬性。有人可能會說,這是在重複自己,但在我看來,這使整個實體更容易閱讀。

噢,如果可以的話,我不會使用特定於ORM的方法(它不是我的域模型的一部分)初始化創建日期。這將在我的構造函數中完成:

/** 
* @var DateTime $createddate 
* 
* @ORM\Column(type="datetime") 
*/ 
private $createddate; 

public function __construct() 
{ 
    $this->createddate = new \DateTime(); 
    // ... and other business rules that need to be enforced in the constructor 
}