Gute Frage!
Was die Entwicklung des World Wide Web angeht, was ist, wenn Sie auch Folgendes fragen?
"Wenn einer Steuerung eine falsche Benutzereingabe von einer Benutzerschnittstelle aus übermittelt wird, sollte die Steuerung die Ansicht in einer Art zyklischen Schleife aktualisieren, um zu erzwingen, dass Befehle und Eingabedaten genau sind, bevor sie verarbeitet werden ? Wie? Wie wird die Ansicht unter normalen Bedingungen aktualisiert Bedingungen Ist eine Ansicht eng an ein Modell gekoppelt? Ist die Kerngeschäftslogik der Benutzereingabevalidierung des Modells oder ist sie vorläufig und sollte daher innerhalb des Controllers erfolgen (da Benutzereingabedaten Teil der Anforderung sind)?
(Kann und sollte eine Instanziierung eines Modells tatsächlich verzögert werden, bis eine gute Eingabe erfolgt?)
Meiner Meinung nach sollten Modelle einen reinen und makellosen Umstand (so weit wie möglich) handhaben, der nicht durch die grundlegende Validierung der HTTP-Anforderungseingaben beeinträchtigt wird , die vor der Modellinstanziierung (und definitiv bevor das Modell Eingabedaten erhält) erfolgen sollte. Da das Verwalten von Statusdaten (persistent oder anderweitig) und API-Beziehungen die Welt des Modells ist, können grundlegende Überprüfungen der HTTP-Anforderungseingaben im Controller erfolgen.
Zusammenfassend.
1) Überprüfen Sie Ihre Route (aus der URL analysiert), da der Controller und die Methode vorhanden sein müssen, bevor etwas anderes ausgeführt werden kann. Dies sollte auf jeden Fall im Front-Controller-Bereich (Router-Klasse) geschehen, bevor Sie zum wahren Controller gelangen. Duh. :-)
2) Ein Modell kann viele Quellen für Eingabedaten haben: eine HTTP-Anfrage, eine Datenbank, eine Datei, eine API und ja, ein Netzwerk. Wenn Sie Ihre gesamte Eingabevalidierung in das Modell einfügen möchten, betrachten Sie die Eingabevalidierung für HTTP-Anforderungen als Teil der Geschäftsanforderungen für das Programm. Fall abgeschlossen.
3) Es ist jedoch kurzsichtig, die Ausgaben für die Instanziierung vieler Objekte zu durchlaufen, wenn die HTTP-Anforderungseingabe nicht gut ist! Sie können feststellen, ob die Eingabe von ** HTTP-Anforderungen ** in Ordnung ist ( die mit der Anforderung eingegangen ist ), indem Sie sie validieren, bevor Sie das Modell und alle seine Komplexitäten instanziieren (ja, vielleicht noch mehr Validatoren für API- und DB-Eingabe- / Ausgabedaten).
Testen Sie Folgendes:
a) Die HTTP-Anforderungsmethode (GET, POST, PUT, PATCH, DELETE ...)
b) Minimale HTML-Steuerelemente (haben Sie genug?).
c) Maximale HTML-Steuerelemente (haben Sie zu viele?).
d) Richtige HTML-Steuerelemente (haben Sie die richtigen?).
e) Eingabecodierung (normalerweise UTF-8?).
f) Maximale Eingabegröße (ist eine der Eingaben unzulässig?).
Denken Sie daran, dass Sie möglicherweise Zeichenfolgen und Dateien abrufen, sodass das Warten auf die Instanziierung des Modells sehr teuer werden kann, wenn Anforderungen Ihren Server erreichen.
Was ich hier beschrieben habe, trifft auf die Absicht, dass die Anforderung über den Controller eingeht. Wenn Sie die Überprüfung der Absicht auslassen, ist Ihre Anwendung anfälliger. Absicht kann nur gut sein (nach deinen Grundregeln spielen) oder schlecht (außerhalb deiner Grundregeln gehen).
Die Absicht für eine HTTP-Anfrage ist alles oder nichts. Alles ist bestanden oder die Anfrage ist ungültig . Sie müssen nichts an das Modell senden.
Diese Grundstufe der HTTP - Anforderung Absicht hat nichts mit normalen Benutzereingabefehler und Validierung zu tun. In meinen Anwendungen muss eine HTTP-Anforderung auf die oben genannten fünf Arten gültig sein, damit ich sie berücksichtigen kann. In einer Verteidigung-in-Tiefe Art zu sprechen, erhalten Sie nie auf Benutzereingaben Validierung auf der Server-Seite , wenn alle diese fünf Dinge fehlschlagen.
Ja, dies bedeutet, dass auch die Dateieingabe Ihren Front-End-Versuchen entsprechen muss, um den Benutzer zu verifizieren und ihm die maximal akzeptierte Dateigröße mitzuteilen. Nur HTML? Kein JavaScript? Gut, aber der Benutzer muss über die Konsequenzen des Hochladens von zu großen Dateien informiert werden (hauptsächlich, dass sie alle Formulardaten verlieren und aus dem System geworfen werden).
4) Bedeutet dies, dass die Eingabedaten für HTTP-Anforderungen nicht Teil der Geschäftslogik der Anwendung sind? Nein, es bedeutet nur, dass Computer endliche Geräte sind und Ressourcen mit Bedacht eingesetzt werden müssen. Es ist sinnvoll, böswillige Aktivitäten früher und nicht später einzustellen. Sie zahlen mehr in Rechenressourcen für das Warten, um es später zu stoppen.
5) Wenn die HTTP-Anforderungseingabe fehlerhaft ist, ist die gesamte Anforderung fehlerhaft . So sehe ich es. Die Definition einer guten HTTP-Anforderungseingabe wird von den Geschäftsanforderungen des Modells abgeleitet, es muss jedoch einen gewissen Punkt für die Abgrenzung der Ressourcen geben. Wie lange werden Sie eine schlechte Anfrage noch leben lassen, bevor Sie sie töten und sagen: "Oh, hey, macht nichts. Schlechte Anfrage."
Das Urteil ist nicht einfach, dass der Benutzer einen vernünftigen Eingabefehler begangen hat, sondern dass eine HTTP-Anfrage so unzulässig ist, dass sie als böswillig eingestuft und sofort gestoppt werden muss.
6) Für mein Geld ist die HTTP-Anfrage (METHODE, URL / Route und Daten) entweder ALLES in Ordnung oder NICHTS anderes kann fortgesetzt werden. Ein robustes Modell muss sich bereits mit Validierungsaufgaben befassen, aber ein guter Ressourcenschäfer sagt: "Mein Weg oder der hohe Weg. Kommt richtig oder kommt gar nicht."
Es ist jedoch Ihr Programm. "Es gibt mehr als einen Weg, dies zu tun." Manche Wege kosten mehr Zeit und Geld als andere. Ein späteres Validieren von HTTP-Anforderungsdaten (im Modell) sollte über die Lebensdauer einer Anwendung (insbesondere beim Vergrößern oder Verkleinern) höhere Kosten verursachen.
Wenn Ihre Validatoren modular aufgebaut sind, sollte die Validierung der grundlegenden * HTTP-Anforderungseingabe ** im Controller kein Problem darstellen. Verwenden Sie einfach eine strategische Validator-Klasse, in der Validatoren manchmal auch aus spezialisierten Validatoren bestehen (E-Mail, Telefon, Formular-Token, Captcha, ...).
Einige halten dies für völlig falsch, aber HTTP steckte noch in den Kinderschuhen, als die Viererbande Entwurfsmuster schrieb : Elemente wiederverwendbarer objektorientierter Software .
================================================ =======================
Da es sich nun um die normale Überprüfung von Benutzereingaben handelt (nachdem die HTTP-Anforderung als gültig eingestuft wurde), wird die Ansicht aktualisiert, wenn der Benutzer Fehler macht, über die Sie nachdenken müssen! Diese Art der Benutzereingabevalidierung sollte im Modell erfolgen.
Sie haben keine Garantie für JavaScript im Front-End. Das heißt, Sie können keine asynchrone Aktualisierung der Benutzeroberfläche Ihrer Anwendung mit Fehlerstatus garantieren. Eine echte progressive Verbesserung würde auch den synchronen Anwendungsfall abdecken.
Den synchronen Anwendungsfall zu berücksichtigen, ist eine Kunst, die immer mehr verloren geht, weil einige Leute nicht die Zeit und Mühe auf sich nehmen wollen, den Status aller ihrer UI-Tricks zu verfolgen (Steuerelemente ein- / ausblenden, Steuerelemente deaktivieren / aktivieren) , Fehleranzeigen, Fehlermeldungen) im Back-End (in der Regel durch Statusverfolgung in Arrays).
Update : Im Diagramm sage ich, dass das auf View
das verweisen soll Model
. Nein. Sie sollten Daten an View
das übergeben Model
, um eine lose Kopplung zu erhalten.