2014-01-16 17 views
7

Ich habe ein symfony2-Projekt, das ein halbes Dutzend wichtiger Entitätstypen enthält. Ich benutze Lehre.symfony2 - eine Basisentitätsklasse erweitern oder Entitäten nicht in Beziehung halten?

Diese Unternehmen haben eine Reihe von identischen Feldern, wie CreatorID, erstellt, aktualisiert, Status und Titel. Im Moment ist jede Entität separat definiert - natürlich gibt es viel Doppelarbeit von Basiscode (und auch von db-Feldern).

Ich lerne OOP wie ich Symfony2 lernen, so dass ich tastend hier, aber meine Frage ist:

ist es am besten Praxis betrachtet, jede Einheit als in sich geschlossene Klasse zu halten? Oder wäre es vorzuziehen, eine neue Basisklasse für die gemeinsamen Eigenschaften zu erstellen und dann die anderen Entitäten die Basiseinheit erweitern zu lassen?

Bonus-Frage:

Und wenn es besser ist in der Tat Einheiten zu bauen, die von einer übergeordneten Klasse erbt, kann ich vage zwei Möglichkeiten vor Augen führen:

1) die übergeordnete Klasse ist eine vollständig kartiert Lehre Einheit , mit einer eigenen Tabelle in der Datenbank, die wir nennen werden, oh, nennen wir es "Knoten". Wenn Sie also eine untergeordnete Entität aufrufen, wird immer ein zusätzlicher Join zwischen der Nodes-Tabelle und der Entitätstabelle des Inhaltstyps "Child" eingefügt.

2) die Elternklasse ist eine - äh - abstrakte Klasse(), die gemeinsamen Eigenschaften der anderen Einheiten definiert, aber nicht eine tatsächliche Datenbank-Präsenz?. Jede untergeordnete Entität implementiert die gemeinsam genutzten Eigenschaften separat, so dass die DB-Struktur identisch mit meiner aktuellen Konfiguration bleibt, aber es gibt (vermutlich) weniger Duplizierung von Code beim Definieren von Entitäten.

Ich suche vor allem für die Beratung über die allgemeine Frage - Kind Einheiten eine Basisentität erstreckt, oder nur getrennte Einheiten. Nicht erwarten, dass jemand die beste Implementierung erklärt, obwohl Hinweise willkommen sind.

Antwort

9

Ich würde eine abstrakte Basis-Entity-Klasse erstellen und Ihre anderen Entitäten erweitern lassen. Zum Beispiel:

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; 

... 

} 

Dann jede Ihrer Einheiten können diese erweitern:

class SomeEntity extends AbstractEntity 
{ 

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

Option 2 ist die richtige - gäbe es keine konkrete Tabelle in der Datenbank für die abstrakte Klasse sein.

Sie könnten noch andere abstrakte Klassen haben, die die Basisklasse erweitern, wenn sie benötigt wird. Zum Beispiel würde eine AbstractVehicle-Entität die Basiseinheit erweitern. Wenn Sie beispielsweise alle Untereinheiten von AbstractVehicle (z. B. Auto, Van usw.) in derselben Tabelle (z. B. "Fahrzeug") verwenden möchten, können Sie eine Discriminator Map verwenden. This article on Inheritence Mapping könnte nützlich sein, zu lesen.

+1

Fantastisch, vielen Dank für die klare Antwort und die wertvolle Richtung für das weitere Studium. Die Vererbung der einzelnen Tabellen gegen die Vererbung der Klassen-Tabelle sind genau die Begriffe in Doctrinese, nach denen ich suchte. –

Verwandte Themen