Ein Controller pro Seite oder mehrere Seiten in einem Controller?


16

Ich wollte nur einen Rat bezüglich der MVC-Vorgehensweise. Ich verwende Codeigniter und habe mich gefragt, ob es besser ist, einen Controller pro Seite für eine Website oder einen Controller für alle Seiten zu haben.

Angenommen, ich habe eine einfache Website, auf der Sie die Startseite besuchen, sich anmelden, ein Konto erstellen und den Administrator kontaktieren können.

  1. Wäre es besser, diese Controller zu haben: Frontend (Index), Login, Account, Kontakt ODER einen Controller namens Frontend oder was auch immer mit den Aktionen Login, CreateAccount, Contact?

  2. Wann wissen Sie, ob es in einer Situation besser ist, einen Controller zu verwenden?


Ich habe immer nach dem Credo gelebt: Ein Beherrscher, der sie alle regiert und in der Dunkelheit bindet. (Nicht wirklich, aber ich mag den Klang. :-)
Peter Rowell

Antworten:


16

Es ist besser, Controller pro Logikeinheit zu haben, zum Beispiel AccountController (Login, Registrierung), PagesController (Home, Kontakt), Backend -> PagesController (Erstellen, Bearbeiten, Löschen), UsersController (Erstellen, Bearbeiten, Löschen) und so weiter.


Wie würden Sie eine Website mit diesen Bereichen darstellen: Startseite, Login, Konto, Kontakt. Würden Sie 2 Controller wie in Ihrem Beispiel verwenden? Wenn du zu localhost gehst, öffne den Homecontroller und wenn du zu localhost gehst, solltest du dich theoretisch nicht an den Controller wenden? und was meinst du mit backend?
Rushino

Es kommt darauf an, wie die Seiten aufgebaut sind und wie viele Seiten Sie haben. Ich mache HomeController (home, contact) oder PagesController (home, contact OR details (id)). In ASP.NET MVC haben Sie beispielsweise Standard-HomeController mit Startseite und Info-Seite.
Santas

Ich mag diese Methode. Auch ein ClientController (oder wie auch immer Sie ihn nennen möchten) für Aktionen, die über Jquery.Ajax aufgerufen werden und für keinen bestimmten Teil Ihrer Anwendung spezifisch sind. dh wiederverwendbar aus einer Ihrer Ansichten
Chris

Scheint mir die richtige Antwort zu sein. CodeIgniter akzeptiert Unterverzeichnisse für Controller, die es ermöglichen, Controller in Zonen zu unterteilen, so dass ich am Ende zwei Seitencontroller haben kann (einen pro Zone). Vielen Dank!
Rushino

Aber würden Sie nicht mit etwas großen Controllern enden, obwohl die Aktionen alle relativ sind? Oder ist das kein Problem?
Kid Diamond

4

@Rushino Sie haben hier zwei "Apps" - das Front-End (für Leser) und das Back-End (für Administratoren). Für jede Funktionsgruppe haben Sie einen Controller.

Die Anmeldung ist eine solche Gruppe, die die Erzeugung des Formular-HTML (die Felder, die Ansicht aufrufend) und die Behandlung des Formulars (die Validierung, die Verbindung mit dem Modell) umfasst. 'Login' ist also ein Controller mit zwei Aktionen - generateForm und handleForm.

Pages ist unterteilt in die Front-End-App, in der nur Seiten angezeigt werden, und in die Back-End-App, in der sie bearbeitet, gelöscht, erstellt und möglicherweise auf andere Weise angezeigt werden können. Die Homepage ist mindestens eine 'andere Seite' im Frontend, passt also in den Seiten-Controller. Auf dem Backend könnte seine Logik so unterschiedlich sein, dass es einen völlig anderen Controller rechtfertigt.

Für Benutzer - Wenn Benutzer sich registrieren können, benötigen sie einen Frontend-Controller. Wenn nicht, wird alles, was mit Benutzern zu tun hat, im Backend ausgeführt.

Beachten Sie, dass für jede Backend-Funktion möglicherweise sowohl ein Generator als auch ein Handler erforderlich sind. Diese Dinge können jedoch mit einem Plugin, das ein generischer Formulargenerator ist, in Konfigurationsdateien aufgeteilt werden.

Zusammenfassend sieht es so aus:

Frontend
  Pages
    View, Handle
  Login
    View, Handle
  Users
    Register (note that the handler can be the same as 'create' on the backend)
  Contact
    View
    Handle

Backend
  Users
    Create, Delete, Edit, Update, View
  Pages
    Create, Delete, Edit, Update, View

Warten Sie .. Sie sagen, dass ein Abschnitt eine App darstellt? interessante Art und Weise, es zu tun (und wahrscheinlich DIE Art und Weise, es zu tun). Ich frage mich, ob Codeigniter das auf diese Weise tun. Ich muss sicher sein, dass Sie von einer App zu einer anderen wechseln können, ohne eine Sitzung oder einen Verbindungsstatus zu unterbrechen.
Rushino

1
@Rushino CodeIgniter kann dies auf diese Weise tun - Sie können Ordner in das Controllerverzeichnis einfügen. Die Unterscheidung zwischen "Apps" erfolgt nicht auf Datenbank- / Modellebene, sondern auf Controller- / Ansichtsebene. Der Grund für die Trennung ist, dass Ihr Backend ganz andere Dinge tut, oft mit einem völlig anderen Design. Dies hilft bei der Sicherheit, da Sie das gesamte Backend-Verzeichnis durch IP einschränken können. Und es hilft bei der Entwicklung, weil Sie am Backend arbeiten können, ohne das Frontend zu beeinflussen.
Dan bläst

2

Ich denke, Sie sollten einen Controller pro Geschäftseinheit wie OrdersController für alle Vorgänge im Zusammenhang mit Aufträgen und dergleichen verwenden. Mir ist bekannt, dass Controller in diesem Fall RIESIG sind, aber wir können immer noch Hilfsklassen verwenden, um Dinge wie Modellinitialisierung und Teilklassen zu delegieren, um Aktionen in separaten Dateien zu verteilen.

Beispielsweise kann ich OrdersController Create.cs and OrdersControllerList.cs-Dateien für die OrdersController-Klasse mit den entsprechenden Aktionen haben. Macht die Dinge viel sauberer und sorgt dennoch für zentralisierte Auftragsvorgänge in einer einzigen Steuerungsklasse.

Nur meine 2 Cent.


0

Ich denke, Sie könnten einen anderen Ansatz wählen:

Eine Hauptsteuerung als Vordertür, die Anforderungen an bestimmte Steuerungen liefert. Auf diese Weise können Sie diesen Front-Controller verwenden, um allgemeine Dinge wie Benutzerauthentifizierung, Google Analytics und andere allgemeine Dinge zu überprüfen, die Sie tun möchten, und die MVC-Struktur rein zu halten.

Dies ist nicht meine Idee, aber Symfony Framework funktioniert auf diese Weise, sodass ich Ihnen sagen kann, dass dies meiner Erfahrung nach eine sehr schöne und elegante Art ist, ein Frontend zu implementieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.