Wie erstelle ich eine Domain mit Zend Framework?

Ich fragtediese Frag vor einiger Zeit, aber jetzt möchte ich eine tatsächliche Trennung zwischen der Datenbankzugriffsebene und der Domänenebene implementieren. Ich werde auch daran arbeiten, die Geschäftslogik in die Domäne zu verschieben, in die sie gehört, und aus den Controllerskripten heraus.

Ich verwende Zend Framework, das die Muster "Table Data Gateway" und "Row Data Gateway" für die Datenzugriffsebene implementiert, aber offenbar nicht wirklich definiert, wie eine von der Datenzugriffsebene getrennte Domänenebene erstellt wird. Ich habe überlegt, ein Active Record-Muster zu verwenden, bei dem die Domänenlogik mit der Datenzugriffslogik koexistiert. Es tritt jedoch mindestens einmal die folgende Situation auf, von der ich glaube, dass Active Record sie nicht handhabt:

Ich habe eine einzelne Tabelle "Person", die die Felder person_id und userType enthält.

Jeder Benutzertyp (Administrator, Käufer, Mitarbeiter, Vorgesetzter) ist mit einer bestimmten Geschäftslogik verknüpft, und alle Typen erben einige grundlegende Funktionen von einem Personenobjekt.

Ich möchte das Row Data Gateway-Objekt nicht mit Geschäftslogik aufblähen, die speziell zu einem Benutzertyp gehört, aber ich bin nicht sicher, wie die Domänenebene für die verschiedenen Benutzertypen erstellt werden soll. Beispielsweise erstelle ich ein Person-Objekt, das das PersonGateway-Objekt enthält, und schreibe dann Wrapper-Funktionen, die Aufrufe an das Gateway-Objekt übergeben, oder schreibe ich das Person-Objekt, um das PersonGateway-Objekt zu erweitern und dann nur die spezifischen Funktionen zu implementieren, die ich benötige?

Ähnlich würde ich normalerweise denken, dass dies (teilweise) ein Factory-Problem ist, bei dem ich eine Factory-Methode benötige, die die richtige Unterklasse basierend auf userType instanziiert. Ist das immer noch die beste Methode hier mit der Zend_Db-Klasse von Zend Framework?

Alle Vorschläge oder Links zu Tutorials, die beschreiben, wie man ein Domain-Modell auf Zend_Db erstellt, wären sehr dankbar.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage