2014-01-16 73 views
7

我有一個symfony2項目,其中包括六個主要的實體類型。我正在使用Doctrine。symfony2 - 擴展基礎實體類還是保持實體無關?

這些實體具有許多相同的字段,例如creatorId,Created,Updated,Status和Title。目前,每個實體都是單獨定義的 - 所以當然,基本代碼(以及db字段也是)有很多重複。

我學習OOP爲我學習Symfony2的,所以我在這裏摸索,但我的問題是這樣的:

難道是考慮到保持各實體爲一個自包含的類最佳做法?或者最好爲共享屬性創建一個新的基類,然後讓其他實體擴展基礎實體?

獎金問題:

如果它實際上是更好地建設從父類繼承的實體,我隱約顯現兩個選項:

1)父類是完全映射主義實體,在數據庫中有自己的表格,我們將稱之爲「哦」,我們稱之爲「節點」。因此,調用子實體將始終涉及Nodes表和Child內容類型實體表之間的其他連接。

2)父類是 - um - 抽象類(?),定義其他實體的共享屬性,但沒有實際的數據庫存在。每個子實體都單獨實現共享屬性,以便DB結構與我當前的設置保持一致,但是在定義實體時可能(可能)重複代碼少。

我主要是在尋找關於整個問題的建議 - 子實體擴展一個基本實體,或者只是單獨的實體。不要期望任何人解釋最好的實現,儘管提示是受歡迎的。

回答

9

我會創建一個抽象的基礎實體類,並讓其他實體擴展它。例如:

abstract class AbstractEntity 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    */ 
    protected $id; 

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

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

... 

} 

然後每個實體可以擴展:

class SomeEntity extends AbstractEntity 
{ 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="some_name", type="string", length=255) 
    */ 
    protected $something 
} 

選擇2是正確的 - 不會有任何具體的表在數據庫中的抽象類。

如果需要的話,您仍然可以使用擴展基類的其他抽象類。例如,AbstractVehicle實體會擴展基本實體。例如,如果您希望AbstractVehicle的所有子實體(例如Car,Van等)位於同一個表格(例如'vehicle')中,則可以使用類似Discriminator Map的東西。 This article on Inheritence Mapping可能是有用的閱讀。

+1

太棒了,非常感謝您對進一步學習的明確答案和寶貴方向。單表繼承與類表繼承正是我在Doctrinese中掌握的術語。 –