Kann ein Controller eine Ausnahme von einem Modell abfangen?

8

Nun, es ist technisch möglich, aber würde das die MVC-Architektur durchbrechen?

Ich bin mir nicht sicher, ob diese Art der Kommunikation zwischen Controller und Modell empfohlen wird. Ich werde es anhand eines einfachen Beispiels und zwei Möglichkeiten beschreiben:

OPTION 1 (Modell löst Ausnahme aus und Controller fängt sie ab):

%Vor%

OPTION 2 (der Controller behandelt die Ausnahme vollständig):

%Vor%

**

BEARBEITEN nach einigen Antworten:

**

Dies sind andere Wege, um es basierend auf Ihren Vorschlägen zu lösen. Ich hoffe, die Dinge nicht zu kompliziert zu machen.

OPTION 3 (Modell behandelt die Ausnahme vollständig, wie Ray sagte. KingCrunch schlug auch vor, es besser im Modell zu machen)

%Vor%

OPTION 4 (Der Controller erhält eine benutzerdefinierte untergeordnete Ausnahme, die vom Modell ausgelöst wird, wie in der Datei shiplu.mokadd.im angegeben.)

%Vor%     
Luis Martin 08.01.2013, 22:12
quelle

3 Antworten

5

Modell kann Exception auslösen und Controller oder View sollte es fangen . Sonst weißt du nie, ob dort unten alles richtig funktioniert. Also benutze die erste Option. Stellen Sie jedoch sicher, dass Sie eine ordnungsgemäß abstrahierte Exception werfen, die für den Controller und View aussagekräftig ist.

Um die obige fett gedruckte Zeile zu veranschaulichen, sehen Sie sich diese beiden throw-Anweisungen an, die innerhalb eines Modells verwendet werden.

%Vor%

Das zweite Beispiel zeigt keinen internen Fehler. Es verbirgt es vielmehr. Der Controller sollte niemals wissen, was im Inneren passiert.

In Ihrem Code haben Sie ein einzelnes Modell an einen einzelnen Controller gebunden. Der Controller repräsentiert kein einzelnes Modell. Es verwendet Modell. Und es kann eine beliebige Anzahl von Modellen verwenden. Verbinden Sie also kein einzelnes Modell mit einem Controller mit der Variablen private $model .

    
Shiplu Mokaddim 08.01.2013, 22:21
quelle
2

Definitiv erste Option. Einige Wörter:

  • Es ist die Aufgabe eines Controllers ... nun, Kontrolle. Das heißt, es sollte darauf geachtet werden, dass zumindest eine sinnvolle Fehlermeldung erscheint. Andere Teile der Anwendung können dies vorher tun, wenn sie in der Lage sind, den Ausnahmefall zu handhaben. Dazu gehört das Modell selbst: Wenn es damit umgehen kann, sollte es es tun.

  • save() bedeutet "speichern". Verwenden Sie den Rückgabewert für Statusinformationen nicht falsch. Wenn die Methode nicht in der Lage ist, save() zu erstellen, ist dies eine Ausnahme, und wenn eine Methode Ihnen nicht etwas geben muss, sollte sie Ihnen nichts geben.

KingCrunch 08.01.2013 22:19
quelle
1

Ich bevorzuge Option 3.

Das Modell sollte die Ausnahme abfangen, versuchen, es zu lösen, wenn es nicht auf den Controller übertragen wird, aber nur, wenn es etwas ist, das der Controller ansprechen und wiederherstellen kann. In diesem Fall (eine Art DB-Speicherfehler) fängt es im Modell an, indem es false zurückgibt, sollte eine angemessene Auflösung für den Speicherfehler sein und ausreichend für den Controller bereitstellen, um zu wissen, dass beim Speichern etwas schief gelaufen ist.

Der Controller sollte sich keine Gedanken über Implementierungsdetails darüber machen müssen, wie das Modell das Speichern implementiert.

    
Ray 08.01.2013 22:18
quelle