2015-11-18 178 views
2

我有2個實體具有相同的字段 - 父,子,順序。其實這是一個機制,這3個字段不適用於此實體的內容 - 如名稱,標題,類別等。Symfony2 - 擴展實體,抽象實體

我想將此字段設置爲一個地方,一個類,我正在考慮應該在哪裏放置它。它應該是一個抽象類嗎?或者我應該做一個特質?

我也可以使用ORM \ Discriminator機制,但我認爲這是爲了別的,不是我想做的事。

+0

請您詳細說明您的使用案例嗎?目前,尚不清楚應該如何分享共同行爲的實體。 – k0pernikus

+0

他們沒有關係。它是兩個分離的實體,它們具有相同的字段。 –

+4

更好地使2個正常的實體..通常有相同的屬性,但想法是有儘可能多的獨立的Entitties ..如果你想要怎麼做什麼特質是更好的選擇。 (例如Dates Trait可以存儲創建/更新/發佈的日期時間字段,這些字段可用於不同類型的實體..),您可以在絕對不同的Entites中將其用於您想要的地方。 – Svetoslav

回答

3

我想使與教義@MappedSuperclass註釋一個抽象類,共享字段和實體擴展它們

這裏是具有created_at字段的例子(不要求Gedmo註釋,只是一個例子)

namespace Your\CoreBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\ORM\Mapping\MappedSuperclass; 
use Gedmo\Mapping\Annotation as Gedmo; 


/** 
* Abstract base class to be extended by my entity classes with same fields 
* 
* @MappedSuperclass 
*/ 
abstract class AbstractEntity { 

    /** 
    * @var integer 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @Gedmo\Timestampable(on="create") 
    * @ORM\Column(name="created_at", type="datetime") 
    */ 
    private $createdAt; 


    /** 
    * Get id 
    * @return integer 
    */ 
    public function getId() { 
     return $this->id; 
    } 

    /** 
    * Get createdAt 
    * @return \DateTime 
    */ 
    public function getCreatedAt() { 
     return $this->createdAt; 
    } 

    /** 
    * Set createdAt 
    * 
    * @param \DateTime $createdAt 
    * 
    * @return AbstractEntity 
    */ 
    public function setCreatedAt($createdAt) 
    { 
     $this->createdAt = $createdAt; 

     return $this; 
    } 

} 

您的實體都擴展這個類,如:

class YourEntityClass extends AbstractEntity 
{ 

在YourEntityClass的$ id屬性必須被 「保護」

1

前段時間我有這個問題。我也想爲實體(或值對象,無論)提供很好的抽象,只是有點懶惰。但這不是恕我直言的好方法。

如果來自一個實體的名稱必須具有另一個實體的其他長度,該怎麼辦?如果你想添加新的字段,將其添加到一個實體,並且過了一段時間你想在另一個實體中,但是你忘記將它移動到抽象?

我認爲實體就是這樣一種自治的東西,將它的某些部分移動到抽象概念上是毫無意義和令人困惑的。

請記住KISS的原理。