2015-11-18 4 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 свойство $ идентификатор должен быть "защищенный"

1

У меня был этот вопрос некоторое время назад. Я также хотел иметь красивую абстракцию для объектов (или объектов ценности, что угодно), чтобы быть немного ленивым. Но это не хороший способ ИМХО.

Что делать, если имя от одного объекта должно иметь другую длину, чем другая? Что делать, если вы хотите добавить новое поле, добавить его в один объект, и некоторое время спустя вы захотите его в другом объекте, но вы забыли переместить его в абстракцию?

Я думаю, что сущность является такой вегетативной вещью, что бессмысленно и сбивать с толку перемещение некоторой части ее в абстракцию.

запомнить о принципе KISS.

Смежные вопросы