51 Stimmen

MVC Frage: Sollte ich die Regeln für die Formularvalidierung in den Controller oder in das Modell aufnehmen?

Einerseits könnte die Formularvalidierung als Teil der Anwendungslogik betrachtet werden und daher in das Modell gehören.

Auf der anderen Seite befasst es sich direkt mit den Eingaben, die von der Ansicht kommen, und behandelt die Anzeige von Fehlern usw. Unter diesem Gesichtspunkt ist es sinnvoller, sie in Controllern unterzubringen.

Welches ist der richtige Ansatz aus MVC-Sicht?

P.S. meine Formularvalidierung besteht eigentlich nur aus dem Schreiben einer Liste von Feldern, deren Regeln und der Weitergabe an eine Formularvalidierungsbibliothek, die wahr/falsch zurückgibt, ob sie die Validierung bestanden hat oder nicht.

Beispiel:

$this->load->library('form_validation');
$this->form_validation->set_rules('name', 'Name', 'required');
$this->form_validation->set_rules('email', 'Email', 'required|valid_email');
//........
if ($this->form_validation->validate())
    // Process data
else
    $this->register_form(); //A controller action that will show a view with errors

Sollte dies in einen Controller oder ein Modell eingebaut werden?

2voto

Luís Osório Punkte 51

Es ist eine interessante theoretische Diskussion, aber wenn wir uns auf den Punkt konzentrieren, dass die Frage im Kontext von Codeigniter (CI) gestellt wurde:

In CI können Sie eine benutzerdefinierte Validierungsregel wie die folgende angeben:

$this->form_validation->set_rules('email', 'Email', 'required|callback_my_validation');

In diesem Szenario müssen Sie muss ein definieren öffentliche Aufgabe mit dem Namen "my_validation", die true oder false zurückgeben muss, und der Rahmen fügt den Fehler (wenn er false zurückgibt) zu einem Stapel von Fehlern hinzu.

Also... wenn Sie diesen Code in den Controller einfügen, werden Sie ungewollt Offenlegung einer öffentlichen Url , d.h. es wäre möglich, etwas wie " http://yoursite.com/my_validation " (ich glaube nicht, dass Sie das beabsichtigen). Die einzige Möglichkeit, diese URL zu schützen, wäre, in die Datei "routes.php" zu gehen und dort den Zugriff auf diese URL zu verhindern. Dies scheint nicht praktikabel zu sein und deutet darauf hin, dass die CI-Entwickler die Validierung im Modell behandeln wollten.

1voto

Neil McGuigan Punkte 43578

Das Modell sollte seine eigenen Daten validieren.

Angenommen, Sie haben ein Kontaktmodell, das nur einen Vornamen und eine Telefonnummer erfordert. Es sollte überprüft werden, dass Vorname und Telefonnummer ausgefüllt sind.

Wenn dieses Kontaktmodell jedoch Teil eines Angebots ist, benötigen Sie möglicherweise auch einen vollständigen Namen und eine E-Mail-Adresse.

In diesem Fall könnten Sie entweder das Kontaktmodell erweitern (zu einem QuoteContact-Modell) und weitere Validierungen hinzufügen, oder Sie könnten die zusätzlichen Validierungen im Angebotsmodell durchführen.

Sie sollten Ihre Modelle so schreiben, dass sie in anderen Anwendungen wiederverwendbar sind (auch wenn sie das nie sein werden), sie sollten also unabhängig vom Controller sein. Wenn sich die Validierungen im Controller befinden, gehen sie verloren, wenn Sie beispielsweise zu einer Befehlszeilenversion wechseln.

0voto

prash.patil Punkte 657

Wenn Sie Formular in serverside mit Codeigniter validieren, dann es in Controller validieren

Sie müssen die form_validation-Bibliothek mit autoload wie folgt einbinden

$autoload['libraries'] = array("form_validation") 

ODER Sie laden direkt im Controller

$this->load->library('form_validation');

Dann legen Sie die Validierungsregel für jedes Formularfeld fest

$this->form_validation->set_rules('username', 'User Name', 'required');
$this->form_validation->set_rules('useremail', 'User Email', 'required|valid_email');

Wenn nach der Validierung eines Formularfeldes ein Fehler gefunden wird, wird dieser in der Validierungsfunktion aufgefangen

if ($this->form_validation->validate()) {
    //return back to form
} else {
    //successful validate all field 
}

0voto

Gaurav Ramanan Punkte 3395

Es gibt noch einen weiteren Aspekt, der in den anderen Antworten nicht angesprochen wurde. Es hängt davon ab, was Sie sagen, dass Sie Controller / Ansicht ist! Wenn es sich um Javascript handelt, das bei der Eingabe durch den Benutzer die Gültigkeit prüft, für Sicherheitsgründe sollten Sie auch eine Validierung in Ihrem Backend haben (dies könnte wiederum in der Controller Ihres Backends oder Modells, denn jeder kann einfach Daten über Ajax ohne den Browser pushen.

Para Leistungsgründe Sie sollten eine Validierung in Ihrem Front-End-Controller / Ansicht als auch, weil Sie nicht wollen, um Ihre Datenbank jedes Mal, wenn ein Benutzer wählt eine ungültige Birth Date oder etwas zu berühren.

Abgesehen von der theoretischen Grundlage der Validierung in M, V, und / oder C müssen Sie auch die Praktikabilität von Frontend vs. Backend berücksichtigen, unabhängig von MVC.

Ich persönlich empfehle, sich nicht nur auf eine Validierungsebene zu beschränken. Eine schlecht platzierte Validierung (wie das in den anderen Antworten erwähnte Beispiel "Passwort bestätigen") kann schwerwiegende Auswirkungen auf die Architektur haben.

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