Ist es eine gute Praxis, eine Controller-Funktion von einem anderen Controller aufzurufen?

23

Ich habe einen Fall, in dem ich die Logik einer Suche in einem Controller bearbeite und einige Daten auf der Grundlage von Suchen und Zurücksenden als Statistiken generiere.

Ruft eine bewährte Methode eine Controller-Funktion von einem anderen Controller aus auf? Oder sollten zwei Controller niemals "reden"?

IAmJulianAcosta
quelle

Antworten:

24

Dies ist ziemlich seltsam, obwohl die Antwort von der verwendeten Sprache / dem verwendeten Framework abhängt, da verschiedene Sprachen / Frameworks unterschiedliche MVC-Ansätze haben.

Im Allgemeinen werden Sie keinen Controller eines anderen verwenden, da:

  • Controller geben normalerweise ein Ergebnis eines Typs zurück, der vom MVC-Framework verwendet werden soll. Dieses Ergebnis enthält viele Informationen, die Sie als Anrufer nicht benötigen (z. B. den Namen der Ansicht), und macht es nicht immer einfach, zu den Informationen zu gelangen, die Sie interessieren könnten (in Ihrem Fall die Modell, wenn ich richtig denke).

  • Controller lassen sich nicht einfach aus dem Geschäftscode heraus initialisieren, da sie häufig einige Informationen über die HTTP-Anforderung und den Kontext benötigen. Alle diese Informationen werden voraussichtlich vom MVC-Framework übergeben.

Noch wichtiger ist, wenn Sie eine Reihe von Suchergebnissen in zwei Controllern benötigen - einer, der die Ergebnisse für den Endbenutzer anzeigt, und einer, der Statistiken generiert -, platzieren Sie die Suchlogik einfach in Ihrer Business-Schicht (wo sie überhaupt hingehört). übrigens), und halten Sie Ihre Controller so klein wie möglich.

In MVC besteht die Rolle eines Controllers darin, den Prozess zu orchestrieren:

  • Holen Sie sich die relevanten Eingaben aus der Anfrage,
  • Validatoren die Aufgabe übertragen, die Eingabe zu validieren / zu bereinigen,
  • Rufen Sie die relevanten Methoden der Business-Schicht auf,
  • Geben Sie dem MVC-Framework das resultierende Modell und die Ansicht.

Die Rolle eines Controllers besteht nicht darin, sich mit Geschäftslogik zu befassen.

Sobald der Code in die Business-Schicht verschoben wurde, können Sie eine Suchschnittstelle bereitstellen, die im Gegensatz zu einem Controller, der von einem anderen verwendet wird, auf klare und unkomplizierte Weise wiederverwendet werden kann.

Arseni Mourzenko
quelle
Hallo, danke für deine Antwort. Angenommen, ich habe die Suchlogik in die Business-Schicht verschoben. Wo ist der beste Ort, um die Suchschnittstelle zu platzieren? Ich benutze Laravel.
IAmJulianAcosta
Leider habe ich Laravel noch nie benutzt. Darüber hinaus stelle ich mir vor, dass die Antwort eher von der Architektur Ihrer Anwendung als vom Framework abhängt.
Arseni Mourzenko
Angenommen, Sie befinden sich in einem HTTP-Ordner genau auf einer Ebene mit Ihrem Stammprojekt. Hier können Sie einen Ordner mit dem Namen contract erstellen und alle Ihre Dateien, die als Schnittstelle dienen, hier platzieren
Faris Rayhan