2 Stimmen

MVC-Modell, wo datenbezogene Überprüfungen stattfinden sollen

Ich schreibe gerade meine erste Anwendung mit Zendframework. Meine Frage bezieht sich auf das Model-View-Controller (MVC) Architekturmuster.

Ich habe derzeit ein Modell mit Verweis auf eine Datenbanktabelle. Hier sind die Klassen, die ich derzeit habe:

Model_Person 
Model_PersonMapper 
Model_DbTable_Person

Ich habe im Netz viele Beispiele gesehen, aber bei allen handelt es sich um einfache Fälle von Einfügen/Aktualisieren/Löschen. In meiner Situation muss ich prüfen, ob eine Person existiert, und wenn nicht, muss ich sie einfügen und die ID abrufen (ich weiß, dass save die Id zurückgibt, aber das ist nicht genau das, was ich tun muss, dies ist ein Beispiel).

Es ist ganz einfach, aber ich möchte wissen, wo ich die Datenbanklogik für alle anderen spezifischen Fälle unterbringen soll. Einige andere Fälle könnten Prüfungen über andere Tabellen oder ... was auch immer beinhalten!

Sollte ich alle spezifischen Funktionen in meinem Model_XXXXMapper mit etwas hinzufügen, die sehr spezifisch mit der aktuellen Validierung/Prozess sein würde, die ich tun möchte? wie eine Funktion getIdOfThePersonByNameOrInsertIfNotExists() (Beispielname natürlich!!!)

Oder sollte es in den Controller mit einigen weniger spezifischen Zugang zu meinem Modell würde validiert werden?

Mit anderen Worten, wo muss ich alle datenbezogenen Funktionen oder Prüfungen unterbringen?

1voto

Galen Punkte 29592

Ich würde die Funktion auf jeden Fall in Such- und Erstellungsfunktionen aufteilen.

Hier ist eine grundlegende Implementierung...

$personTG = new Model_PersonTableGateway;
if ( !$person = $personTG->findByName( $name ) ) {

    $person = new Model_Person;
    $person->name = $name;
    // other variables
    $newPersonId = $personTG->create( $person ); // creates a new person

}

Ich benutze Tabellen-Gateway . Sie können Ihre Klasse durch die TG ersetzen.

Sie können die create()-Funktion nur die ID der neu erstellten Person oder die gesamte Person zurückgeben lassen... das bleibt Ihnen überlassen.

1voto

Derek Illchuk Punkte 5548

Ich denke, die eigentliche Arbeit sollte in Ihren Modellobjekten stattfinden, nicht in der Steuerung. Alle Selects/Erstellungen, die mit dem person Tabelle in das DbTable_Person-Objekt, z. B.:

// DbTable_Person
// returns sets of or single Person objects
public function createByName( $name ) // perhaps throws exception if name already exists
public function findById( $id )
public function findByName( $name )
public function findHavingAccount( $account_id ) // references another table

// controller
// with your example, like what Galen said,
// I would let the controller handle this logic
$person = $person_table->findByName($name);
if ( !$person ) {
  $person = $person_table->createByName($name);
}
if ( !$person ) { throw new Zend_Exception('huh?'); }
$id = $person->id; // you wanted the ID

0voto

Sudheer Punkte 680

Sie könnten an Zend_Validate_Db_NoRecordExists und seiner Schwester interessiert sein. Wenn man Zend_Form verwendet, kann man diesen Validator zu seinem Formular Element hinzufügen. Viele Leute verwenden Zend_Form um Daten zu validieren und zu filtern bevor Sie das Domain Modell erreichen.

Wenn man Zend_Form nicht verwendet, kann man einfach diese Validierungsklasse in der eigenen Service-Schicht verwenden. Eine einfache Service Klasse könnte etwas sein wie

 `` `
class Service_Person_Validate 
{ 
  public function creatable($data) 
  { // return true|false 
  } 
}``

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X