Ich stehe vor einem Problem, das auch auf programmers.stackexchange.com liegen könnte, aber da es ziemlich eng mit Doctrine und ZF2 verbunden ist, habe ich es aufgesetzt hier. Lassen Sie mich Ihnen mein Szenario vorstellen:Wie man mit verschiedenen Entity-Eigenschaften für verschiedene Entity-Kategorien umgeht
- Ich habe eine Anwendung, wo Benutzer Entitäten (
BaseEntity
) senden. - Die
BaseEntity
hat die Eigenschaft$cagetory
- auf
$category
Je jedoch die Entity zusätzliche Eigenschaften
Ab einfaches Beispiel haben muss:
class BaseEntity {
protected $id;
protected $title;
protected $description;
}
class MovieEntity {
protected $id;
protected $title;
protected $description;
protected $airingDateStart; // new property
protected $airingDateEnd; // new property
}
Jetzt konnte ich leicht ein zweistufigen formular tun wo ein Benutzer zuerst seine Kategorie auswählt und abhängig davon wird die EntityClass ausgewählt - aber ich kann das nicht haben. Aber das ist nicht gut, denn was ist, wenn der User einen Film in der BaseEntity
-Kategorie anlegt und später dann die Entity in MovieEntity
ändern will? Diese Idee ist also keine sichere Option.
Zusätzliche Anforderungen (um Sachen komplizierter)
- den Kategorien sowie Entities haben durch Lehre
- Jeder
Category
vorgesehen ist über eine einzigeModule
- der Anwendung gesteuert werden Module müssen in die Anwendung platziert werden, ohne dass viel Konfiguration benötigt wird (bei maximal einer DB-Abfrage, um die
CategoryTable
zu befüllen)
Was ich
Zuerst bisher habe ich gewählt mit Doctrines Funktionalität Single Table Inheritance laufen. Dies erlaubte mir, Dinge wie MovieEntity extends BaseEntity
leicht zu machen und die Dinge funktionieren wie ein Zauber, um neue Entitäten zur Datenbank hinzuzufügen. Aber das Hauptproblem bleibt: Was passiert, wenn der Benutzer die Kategorie ändert, würde das die EntityClass ändern und das ist so ziemlich ein No-Go.
Ich meine ja, ich könnte potentiell Dinge meine aktuelle Art und Weise und auf den Wechsel der Kategorie manuell ändern die DiscriminatorColumn
, aber das ist so verdammt schmutzig.
Ein anderer alternativer Ansatz wäre, dass bei der Änderung der Kategorie eine NEUE Entität erstellt wird und die alte zerstört wird, aber das fühlt sich auch irgendwie schmutzig an.
Alles in allem denke ich, dass ich in die falsche Richtung gehe. Es mag ein Entwicklungsmuster geben, von dem ich nicht weiß, dass all meine harte Arbeit wie eine Verschwendung aussieht und die Dinge am Ende sehr einfach werden, aber es scheint, dass ich Dinge übersehe.
vielleicht um eine genauere Vorstellung von dem, was ich bin, du einen Blick auf meiner Anwendung auf GitHub hast:
- DuitMarketplace - das ist die Hauptanwendung mit einer Basis-Kategorie, die ganzen Controller usw.Die
ItemController#editAction()
kann einige weitere Hinweise geben, wie ich einige Dinge automatisieren möchte. - DuitMarketplaceItemVehicle - eine Kategorie, die die erhalten fiel in die MainApp
Vielen Dank im Voraus für all das Feedback erhalte ich kann. Ich bin völlig klar, dass diese Frage wahrscheinlich eine Grenze zwischen einer Existenz von SO vs Programmierer ist. Stackexchange, aber ich entschied mich dafür, es hier doch zu haben.
Hey Tim, danke für deine Eingabe, dass das Design klarer aussieht als das was ich bisher in meiner Anwendung gemacht habe, also danke für die Eingabe. Das Problem, das ich sehe (obwohl ich falsch liegen kann), ist immer noch der CHANGE einer Kategorie. Würde Ihr Beispiel die 'discriminatorColumn' innerhalb der 'Entity' automatisch aktualisieren, wenn eine andere Kategorie ausgewählt ist? Ich werde das sicherlich testen! PS: Um die DiscriminatorMapping von bestimmten Modulen zu erweitern: siehe [my onBootstrap() eines SubModuls] (https://github.com/manuakasam/DuitMarketplaceItemVehicle/blob/master/Module.php#L35-L48) – Sam
Sam, ich don denke ich, es gibt nur ein 'Ding' (oder' BaseEntity'). Das, was "BaseEntity" von "MovieEntity" unterscheidet, wurde in die verschiedenen Kategorien verschoben. Was ich jedoch in der Lösung von timdev vermisse, ist, wie die Werte jener Eigenschaften gespeichert werden, die durch die Kategorie nach 'Thing' definiert sind. Es gibt eine Entity 'ThingCategoryProperty', die eine ManyToOne-Assoziation mit' Thing' und 'Category' hat. Übrigens, Sam, ich mag die Art, wie du den dynamischen Inhalt des 'DiskriminatorMappings' gelöst hast! – netiul
@Sam - Nein, wenn Sie die Kategorie wechseln, löschen Sie eine ThingSomeCategory und fügen eine andere ThingSomeCategory ein. – timdev