Was ist der Unterschied zwischen Controller und Router in MVC?

19

Bedeuten sie dasselbe (Anhängen von URLs an Aktionen oder Aktionen an URLs) oder gibt es einen Unterschied, den ich vermisse?

Beispiel: http://github.com/dannyvankooten/PHP-Router vs. http://konstrukt.dk

thelolcat
quelle
1
Dieser Router klingt für mich eher wie ein verherrlichter Proxy
Ratschenfreak
Sie benötigen nur ein Modell (Datenbank), einen Controller (der der Router ist) und die Ansicht (eine Seite). Das ist es. Wenn Sie einen Router und einen Controller haben, haben Sie es zu kompliziert und verwenden den Router nur, um Daten an einen Controller zu übergeben. Ein Controller ist ein Router, aber ein Router ist kein Controller. Siehe hier code.tutsplus.com/tutorials/mvc-for-noobs--net-10488
Band 1,

Antworten:

15

Router:

Beim Routing wird ein URI-Endpunkt (der Teil des URI, der nach der Basis-URL steht) in Parameter zerlegt, um zu bestimmen, welches Modul, welcher Controller und welche Aktion dieses Controllers die Anforderung erhalten soll.

Regler:

Der Controller implementiert ein »Controller-Muster, bei dem alle Anforderungen vom Controller abgefangen und auf der Grundlage der angeforderten URL (dh der Weiterleitungsanforderung vom Router) an die einzelnen Aktionscontroller gesendet werden.

Sam T
quelle
4

Ein Frontend-Controller sollte mit einem Router und einem Dispatcher zusammenarbeiten , um basierend auf der (HTTP) -Anforderung gegen die Anwendung zu entscheiden, welche konkrete Aktion ausgeführt werden muss, und diese dann auszulösen.

Je nachdem , wie detailliert ein Design ist, können einige Controller - s Arbeit ohne Router s , und sie tun das ihre eigenen Routing oder das Routing ist implizit in der Gestaltung , wie die Anforderung verarbeitet wird.

Einiger Dispatcher s passiert auch eine Anfrage Objekt geschickte Aktionsmethoden . Action-Methode sich dann die zersetzen Antrag teilweise, so dass selbst - Controller noch Aktionen tun können , einige Routing basierend auf der Anfrage. Ein typisches Beispiel hierfür ist der Fall, wenn ein Framework eine Umleitung als Antwort anbietet. Dies zeigt auch, wie verwandt oder nahe Router und Controller sind.

Der Unterschied, der hier normalerweise gezogen wird, besteht darin, dass das Routing die auszuführende Aktionsmethode berücksichtigt oder dabei hilft, sie zu identifizieren, und der Controller dann für die Bereitstellung dieser Aktion verantwortlich ist, aber beide die Anforderung bearbeiten.

Wie Sie sehen, können die Unterschiede zwischen Router und Controller zwischen Implementierungen und Frameworks sehr unterschiedlich sein. Letztendlich hat die konkrete Anwendung ihre Bedürfnisse, unabhängig davon, ob eine bestimmte Abstraktionsebene nützlich ist oder im Weg steht.

Aus den Begriffen würde ich jedoch sagen, dass Controller in der Gesamtanwendung eine höhere Rolle spielt. Dies ist, wo die Aktion sozusagen geht.

hakre
quelle
3

Die Route ordnet eine URL einem Controller zu, bei dem es sich um die Aktion handelt. Manchmal sind die Rollen je nach Framework nicht sehr gut voneinander getrennt.

Kevin
quelle
2

Router sind Teil der Controller-Schicht. Der Router-Verarbeitungsmechanismus ist ein Ersatz für das Front-Controller-Pattern der alten Schule (der große Schalter in der index.php).

In einem modernen Framework definiert ein Router eine direkte Verbindung zwischen einer "Art" möglicher Anforderungen und seinem Prozessor. Im Gegensatz dazu erhält ein Controller nur identifizierende Informationen und analysiert diese Daten in seinem eigenen Kontext.

Dávid Horváth
quelle
0

Ein Router berechnet ganz einfach eine Reise durch die Anwendung, in der Regel basierend auf externen Eingaben wie GET- oder POST-Variablen.

Ein Router ist jedoch kein Bestandteil einer MVC. Mehrere MVC- und HMVC-Frameworks verwenden Router, die jedoch nicht an das MVC-Muster gebunden sind.

Zusätzlich haben sich einige frühe Implementierungen von MVC tatsächlich auf die dateibasierte Trennung von Aktionen mit einer Datei pro Controller für den Zugriff auf separate Controller verlassen. Dies ist für die Anwendung viel besser geeignet, da Sie bei dünnen Controllern mit robusteren Modellen nie zu einer bestimmten Methode im Controller scrollen müssen und daher an einem Ort (dem Modell) auf die Logik zugreifen können, um sie zusammenzusetzen Verhaltensweisen.

MrMesees
quelle
-1

Der Router nimmt die

anfordern

und entscheidet, welche Controller / Controller-Methoden die Anfrage bearbeiten.

Der Controller nimmt die Anfragen an und bearbeitet sie!

Jetzt habe ich auch einen Controller erstellt, der die URL aufteilt und den ersten Teil nach der Basis-URL als Controller und den zweiten Teil als Aktion verwendet. Dies lädt eine Datei, die der Steuerung entspricht, und eine Methode in dieser Datei, die der Aktion entspricht.

Dies ist kein wirklicher Controller (was MVC betrifft), sondern Teil des Routings.

Nehmen Sie zum Beispiel das [GET] uri: example.com/article/view/123 Der MVC-Router analysiert das uri und findet die folgenden Segmente

article view 123 Standardmäßig instanziieren die meisten Router jetzt den articleController und rufen dessen an 123 übergebene Ansichtsmethode als Parameter auf. (Alternativ können Sie auch eine getUriSegment (segmentIdx) -Methode verwenden, die als Entwurf für Ihr Framework geeignet ist.)

Der ArticleController hätte eine View-Methode mit einem $ articleId-Parameter. Diese Methode würde wahrscheinlich so etwas tun: Den angegebenen Artikel abrufen (von einer Datenbank über ein Modell zum Beispiel) und ihn dann anzeigen (wahrscheinlich durch Zurückgeben einer Ansicht, die den vom Modell zurückgegebenen Artikel erhalten hat

Siddarth Nyati
quelle