2009-04-17 10 views
6

Ich verwende derzeit CodeIgniter als mein Framework der Wahl bei der Verwendung von PHP. Eines der Dinge, mit denen ich ringe, ist die Idee einer "Seite" und wie man das in MVC richtig darstellt. Soweit ich weiß, hat CodeIgniter einen Frontcontroller, der an Seitencontroller delegiert. In meinem Denkprozess würde jede Seite ihren eigenen Controller haben. Allzu oft sehe ich jedoch, dass jemand einen Seiten-Controller benutzt, der mit vielen Methoden gefüllt ist. In diesem Sinne wird jede Aktion zur eigenen Seite.Was definiert das traditionelle "Page" Konzept in MVC?

Ich habe die Idee, viele Methoden in einen Controller zu stopfen, nie wirklich gemocht, weil es scheint, als würde es zu viel Aufwand geben, wenn Sie nur eine oder zwei Methoden gleichzeitig im Controller brauchen. Es scheint vernünftiger für jede Seite, ihren eigenen Controller zu haben, und die Aktionen würden nur etwas entsprechen, was Sie auf dieser bestimmten Seite tun können. Denke ich darüber falsch?

Was es verwirrender macht, ist, dass ich in einigen Web-Anwendungen feststellen werde, dass sie einen Controller haben, der mehrere Methoden haben wird (dh Login, Registrierung, Ansicht, Bearbeitung usw.), aber dann auf anderen tatsächlich ein Login-Controller und ein Register-Controller. Was ist der richtige Umgang mit einem "Seitencontroller"?

Antwort

7

Aus einer Domain-Perspektive sage ich definitiv, es macht mehr Sinn, 1 Controller pro Domain-Kontext zu haben. Nicht unbedingt eine pro Seite, obwohl dies je nach Kontext der Fall sein kann. Was ich unter Kontext verstehe, sind "eng miteinander verbundene Aktionen".

Zum Beispiel sollte ein Account-Controller die Anmeldung, Registrierung, Abmeldung, Passwort ändern, Aktionen. Sie alle leben im Rahmen eines "Kontos"

Nehmen Sie zum Beispiel Stackoverflow. Ich hätte einen "Fragen" -Controller, der Aktionen wie DisplayQuestion, AskQuestion, Delete Question, MostRecent Questions usw. hätte. Sie sind alle verschiedene "Ansichten/Seiten", die von einem Controller verwaltet werden.

1

Sie haben Recht, dass jede öffentliche Methode in einem Controller eine "Seite" wird. Das heißt, es ist nicht unbedingt eine Webseite, eine Aktion könnte ein Datenposten sein und dann zu einer anderen Aktion/Seite umleiten, so dass die Seite nicht unbedingt "Webseite" bedeutet.

MVC verwendet viele Konventionen, um die Dinge zum Laufen zu bringen. Zum Beispiel muss jeder Controller mit "Controller" enden. Eine Gruppe von Benutzerseiten (Erstellen, Bearbeiten, Löschen usw.) würde sich also in einem UserController befinden. Im Ordner "Ansichten" wird jede öffentliche Methode oder Aktion innerhalb der Controller-Klasse zu einer Webseite in einem Ordner, der dem Präfix des Controllers entspricht (in diesem Fall ein Benutzerordner). Eine Aktion namens "Delete" innerhalb der Controller-Klasse würde also auf die Delete.aspx-Seite innerhalb des User-Ordners zeigen.

Es scheint ein wenig peinlich zu sein, alle diese Methoden in eine Klasse zu packen, aber es ist eine gute Aufgabe, ähnliche Funktionalitäten basierend auf Ihrem Objekt zu organisieren.

+1

Ihr Punkt über jeden Controller muss mit "Controller" enden, gilt nur für das Asp.Net-Mvc-Framework und nicht unbedingt für das PHP-Framework, mit dem er zu tun hat. – Micah

1

In MVC, eine "Seite" ist, was Sie bekommen, wenn Sie die drei zusammenfügen. Das Modell handhabt die Datenschicht, die Ansicht verarbeitet den tatsächlichen HTML-Code, den der Benutzer sieht, und der Controller entscheidet, wie sie zusammenschalten, um die gewünschten Daten anzuzeigen. Meine Entscheidung, einen separaten Controller oder eine andere Methode für einen vorhandenen Controller zu verwenden, hängt davon ab, wie nahe der Betrieb mit den anderen Controllern ist, die ich habe. Angenommen, ich möchte einen UserAdmin-Controller haben, der wahrscheinlich einen Benutzer hinzufügt, einen Benutzer löscht, Passwörter ändert usw. Wenn ich Funktionen hinzufüge, die sich mit der Änderung eines Benutzerkontos befassen, würde ich es höchstwahrscheinlich verwenden da drin. Wenn ich sie in ihre eigenen Controller aufgeteilt hätte, würde ich natürlich eine weitere hinzufügen. Controller ermöglichen es Ihnen, ähnliche Aufgaben zusammenzustellen, sodass sie das, was bereits in der Klasse vorhanden ist, nutzen können, anstatt das, was bereits getan wurde, neu zu erstellen. Eine Menge davon ist, wie der Programmierer denkt, dass es getan werden sollte.Was für Sie Sinn ergibt, mag für mich keinen Sinn ergeben, das ist die Entscheidung des Entwicklers (oder des Designers).

Verwandte Themen