MVC für Noobs

Der Model-View-Controller (MVC) ist wahrscheinlich eines der am häufigsten zitierten Muster in der Welt der Web-Programmierung in den letzten Jahren. Jeder, der sich derzeit mit der Entwicklung von Webanwendungen beschäftigt, hat das Akronym schon hunderte Male gehört oder gelesen. Heute klären wir, was MVC bedeutet und warum es so beliebt ist.

Alte Geschichte…

MVC ist kein Entwurfsmuster, es ist ein Architekturmuster, das einen Weg beschreibt, um unsere Anwendung und die Verantwortlichkeiten und Interaktionen für jeden Teil in dieser Struktur zu strukturieren.

Es wurde erstmals 1979 beschrieben und der Kontext war offensichtlich etwas anders. Das Konzept der Webanwendung gab es nicht. Tim Berners Lee hat Anfang der neunziger Jahre die Saat des World Wide Web ausgesät und die Welt für immer verändert. Das Muster, das wir heute für die Webentwicklung verwenden, ist eine Anpassung des ursprünglichen Musters.

Die wilde Popularisierung dieser Struktur für Webanwendungen ist auf die Integration in zwei Entwicklungsframeworks zurückzuführen, die immens populär geworden sind: Struts und Ruby on Rails. Diese beiden Umgebungen waren der Weg für die Hunderte von später erstellten Frameworks.

MVC für Webanwendungen

Die Idee hinter dem Model-View-Controller-Architekturmuster ist einfach: In unserer Anwendung müssen die folgenden Verantwortlichkeiten klar voneinander getrennt sein:

Die Anwendung ist in diese drei Hauptkomponenten unterteilt, von denen jede für verschiedene Aufgaben zuständig ist. Sehen wir uns eine ausführliche Erklärung und ein Beispiel an.

Regler

Das Regler verwaltet die Benutzeranforderungen (wird als HTTP-GET- oder POST-Anforderung empfangen, wenn der Benutzer auf GUI-Elemente klickt, um Aktionen auszuführen). Seine Hauptfunktion besteht darin, die für die Benutzeraktion erforderlichen Ressourcen / Objekte aufzurufen und zu koordinieren. Normalerweise ruft der Controller das entsprechende Modell für die Aufgabe auf und wählt dann die richtige Ansicht aus.

Modell

Das Modell sind die Daten und Regeln, die für diese Daten gelten und die von der Anwendung verwalteten Konzepte darstellen. In jedem Softwaresystem wird alles als Daten modelliert, mit der wir auf eine bestimmte Art und Weise umgehen. Was ist ein Benutzer, eine Nachricht oder ein Buch für eine Anwendung? Nur Daten, die nach bestimmten Regeln gehandhabt werden müssen (Datum darf nicht in der Zukunft liegen, E-Mail muss ein bestimmtes Format haben, Name darf nicht länger als x Zeichen lang sein usw.).

Das Modell gibt dem Controller eine Datendarstellung dessen, was der Benutzer angefordert hat (eine Nachricht, eine Liste von Büchern, ein Fotoalbum usw.). Dieses Datenmodell ist das gleiche, unabhängig davon, wie wir es dem Benutzer präsentieren möchten. Deshalb können wir eine beliebige verfügbare Ansicht zum Rendern auswählen.

Das Modell enthält den wichtigsten Teil unserer Anwendungslogik, die Logik, die für das Problem gilt, mit dem wir uns befassen (ein Forum, ein Geschäft, eine Bank usw.). Der Controller enthält eine internere Organisationslogik für die Anwendung selbst (eher wie die Verwaltung)..

Aussicht

Das Aussicht bietet verschiedene Möglichkeiten, die vom Modell erhaltenen Daten zu präsentieren. Dies können Vorlagen sein, bei denen diese Daten gefüllt sind. Es kann verschiedene Ansichten geben, und der Controller muss entscheiden, welche verwendet werden soll.

Eine Webanwendung besteht normalerweise aus einer Reihe von Controllern, Modellen und Ansichten. Der Controller kann als Hauptcontroller aufgebaut sein, der alle Anforderungen empfängt und spezifische Controller aufruft, die Aktionen für jeden Fall abwickeln.

Lassen Sie uns ein Beispiel sehen

Angenommen, wir entwickeln einen Online-Buchladen. Der Benutzer kann folgende Aktionen ausführen: Bücher anzeigen, registrieren, kaufen, Artikel zur aktuellen Bestellung hinzufügen, Bücher erstellen oder löschen (wenn er Administrator ist usw.). Mal sehen, was passiert, wenn der Benutzer auf das klickt Fantasie Kategorie, um die verfügbaren Titel anzuzeigen.

Wir verfügen über einen bestimmten Controller, der alle Aktionen im Zusammenhang mit Büchern abwickelt (Anzeigen, Bearbeiten, Erstellen usw.). Nennen wir es books.controller.php für dieses Beispiel. Wir haben auch ein Modell, beispielsweise book_model.php, das Daten und Logik für die Artikel im Shop verarbeitet. Zum Schluss haben wir eine Reihe von Ansichten, zum Beispiel eine Liste von Büchern, eine Seite zum Bearbeiten von Büchern usw.

Die folgende Abbildung zeigt, wie der Benutzer die Anzeige der Fantasy-Bücherliste anfordert:

Der Controller (books_controller.php) empfängt die Benutzeranforderung [1] als HTTP-GET- oder POST-Request (wir können auch einen zentralen Controller haben, beispielsweise index.php, der sie empfängt und dann books_controller.php aufruft.).

Der Controller prüft die Anforderung und die Parameter und ruft das Modell auf (book_model.php). fragen ihn, um die Liste der verfügbaren Fantasy-Bücher zurückzugeben [2].

Das Modell ist dafür verantwortlich, diese Informationen aus der Datenbank zu holen (oder wo auch immer sie gespeichert ist) [3], gegebenenfalls Filter oder Logik anwenden und die Daten zurückgeben, die die Liste der Bücher darstellen [4]..

Der Controller verwendet die entsprechende Ansicht [5], um diese Daten dem Benutzer anzuzeigen [6-7]. Wenn die Anforderung von einem Mobiltelefon stammt, wird eine Ansicht für Mobiltelefone verwendet. Wenn der Benutzer eine bestimmte Skin ausgewählt hat, wird die entsprechende Ansicht ausgewählt und so weiter.

Was sind die Vorteile?

Der offensichtlichste Vorteil, den wir mit MVC erzielen, ist die klare Trennung von Präsentation (Schnittstelle zum Benutzer) und Anwendungslogik.

Unterstützung für verschiedene Arten von Benutzern, die unterschiedliche Gerätetypen verwenden, ist heutzutage ein häufiges Problem. Die dargestellte Schnittstelle muss unterschiedlich sein, wenn die Anforderung von einem Desktop-Computer oder einem Mobiltelefon stammt. Das Modell gibt exakt dieselben Daten zurück. Der einzige Unterschied besteht darin, dass der Controller eine andere Ansicht wählt, um sie zu rendern (wir können uns eine andere Vorlage vorstellen)..

Neben der Trennung der Sicht von der Geschäftslogik reduziert die Trennung von M-V-C die Komplexität beim Entwurf großer Anwendungen. Der Code ist viel strukturierter und daher einfacher zu warten, zu testen und wiederzuverwenden.

Ok, aber warum ein Framework??

Wenn Sie ein Framework verwenden, ist die Grundstruktur für MVC bereits vorbereitet, und Sie müssen diese Struktur nur erweitern, indem Sie Ihre Dateien im entsprechenden Verzeichnis ablegen, um dem Model-View-Controller-Muster zu entsprechen. Außerdem erhalten Sie eine Menge Funktionen, die bereits geschrieben und gründlich getestet wurden.

Nehmen Sie cakePHP als Beispiel für ein MVC-Framework. Nach der Installation werden drei Hauptverzeichnisse angezeigt:

  • app /
  • Kuchen/
  • Verkäufer /

Das App In diesem Ordner legen Sie Ihre Dateien ab. Es ist Ihr Ort, um Ihren Teil der Anwendung zu entwickeln.

Das Kuchen Ordner ist, wo CakePHP seine Dateien hat und wo sie ihren Teil entwickelt haben (Hauptfunktionen des Frameworks).

Das Anbieter Ordner ist bei Bedarf für PHP-Bibliotheken von Drittanbietern.

Ihr Arbeitsplatz (App-Verzeichnis) hat folgende Struktur:

  • app /
    • config /
    • Steuerungen /
    • Gebietsschema /
    • Modelle /
    • Plugins/
    • Tests /
    • tmp /
    • Verkäufer /
    • Ansichten /
    • webroot /

Jetzt müssen Sie Ihre Controller in die Steuerungen Verzeichnis, Ihre Modelle in der Modelle Verzeichnis und Ihre Ansichten in… der Ansichten Verzeichnis!

Sobald Sie sich an Ihr Framework gewöhnt haben, können Sie wissen, wo Sie nach fast jedem Code suchen müssen, den Sie ändern oder erstellen müssen. Diese Organisation allein macht die Wartbarkeit wesentlich einfacher.

Lassen Sie uns unser Beispiel einrahmen

Da in diesem Lernprogramm nicht gezeigt werden soll, wie eine Anwendung mit cakePHP erstellt wird, zeigen wir hier nur Beispielcode für die Modell-, Ansichts- und Steuerungskomponenten und kommentieren die Vorteile der Verwendung eines MVC-Frameworks. Der Code ist zu stark vereinfacht und für reale Anwendungen nicht geeignet.

Denken Sie daran, dass wir einen Buchladen hatten und einen neugierigen Benutzer, der die vollständige Liste der Bücher in sehen möchte Fantasie Kategorie. Wir haben gesagt, dass der Controller die Anfrage erhält und die notwendigen Maßnahmen koordiniert.

Wenn der Benutzer darauf klickt, fordert der Browser diese URL an:

 www.ourstore.com/books/list/fantasy

CakePHP formatiert gerne URLs in der Form / controller / action / param1 / param2, wobei Aktion ist die Funktion, die innerhalb der Steuerung aufgerufen werden soll. Im alten klassischen URL-Format wäre dies:

 www.ourstore.com/books_controller.php?action=list&category=fantasy

Regler

Mit Hilfe des CakePHP-Frameworks sieht unser Controller etwa so aus:

 set ('books', $ this-> Book-> findAllByCategory ($ category));  Funktion add () … Funktion delete () ……?>

Einfach, nicht wahr? Dieser Controller wird als books_controller.php gespeichert und in / app / controller abgelegt. Sie enthält die Listenfunktion, um die Aktion in unserem Beispiel auszuführen, aber auch andere Funktionen, um andere buchbezogene Aktionen auszuführen (neues Buch hinzufügen, neues Buch löschen usw.)..

Das Framework bietet viele Dinge für uns und nur eine Zeile ist notwendig, um die Bücher aufzulisten. Wir haben Basisklassen mit dem grundlegenden Verhalten des Controllers definiert, daher erben wir von ihnen (AppController, der von Controller erbt)..

In der Listenaktion muss lediglich das Modell aufgerufen werden, um die Daten abzurufen, und dann eine Ansicht auswählen, um sie dem Benutzer anzuzeigen. Lassen Sie uns erklären, wie das gemacht wird.

dieses-> Buch ist unser Modell und dieser Teil:

 $ this-> Book-> findAllByCategory ($ category)

sagt dem Modell, dass es die Liste der Bücher in der ausgewählten Kategorie zurückgeben soll (wir werden das Modell später sehen).

Das einstellen Methode in der Zeile:

 $ this-> set ('books', $ this-> Book-> findAllByCategory ($ category));

Ist der Controller Weg, um Daten an die Ansicht zu übergeben. Es setzt die Bücher Variable zu den vom Modell zurückgegebenen Daten und macht sie für die Ansicht verfügbar.

Jetzt müssen wir nur noch die Ansicht rendern, dies wird jedoch automatisch von cakePHP durchgeführt, wenn die Standardansicht gewünscht wird. Wenn wir eine andere Sichtweise benötigen, müssen wir sie explizit mit der machen Methode.

Modell

Das Modell ist noch einfacher:

Warum leer? Weil es von einer Basisklasse erbt, die die erforderliche Funktionalität bietet, und wir die Konventionen für CakePHP-Namen befolgt haben, damit das Framework andere Aufgaben automatisch ausführen kann. Beispielsweise weiß CakePHP anhand von Namen, dass dieses Modell in BooksController verwendet wird und auf eine Datenbanktabelle namens Bücher zugreift.

Mit dieser Deklaration haben wir nur ein Buchmodell, das Daten aus der Datenbank lesen, löschen oder speichern kann

Der Code wird als book.php gespeichert und in / app / models abgelegt.

Aussicht

Jetzt müssen wir nur noch eine Ansicht für die Listenaktion erstellen. Die Ansicht enthält den HTML-Code und einige (so wenige wie möglich) PHP-Zeilen, die durch das vom Modell bereitgestellte Books-Array geleitet werden.

Titel Autor Preis

Wie wir sehen, erzeugt die Ansicht keine vollständige Seite, sondern nur ein HTML-Fragment (in diesem Fall eine Tabelle). Dies liegt daran, dass CakePHP eine andere Möglichkeit bietet, das Layout der Seite zu definieren, und die Ansichten in dieses Layout eingefügt werden. Das Framework bietet auch einige Hilfsobjekte, um die Erstellung von HTML-Ausschnitten (Einfügen von Formularen, Links, Ajax oder JavaScript) zu vereinfachen..

Wir machen dies zur Standardansicht, speichern es als list.ctp (liste ist der Name der Aktion und ctp bedeutet Kuchenvorlage) und platziert es in / app / views / books (innerhalb von Büchern, da dies Ansichten für Büchersteuerungsaktionen sind)..

Und dies vervollständigt die drei Komponenten mit Hilfe des CakePHP-Frameworks!

Fazit

Wir haben gelernt, was heute wahrscheinlich das am häufigsten verwendete architektonische Muster ist. Wir müssen uns jedoch bewusst sein, dass wir, wenn wir über Muster in der Programmierwelt sprechen, von flexiblen Rahmen sprechen, die auf das jeweilige Problem zugeschnitten sind. Wir werden Implementierungen finden, die Variationen der Struktur, die wir gesehen haben, einführen, aber das Wichtigste ist, dass das Muster uns letztendlich hilft, eine klare Trennung zwischen Verantwortlichkeiten und besserer Wartbarkeit, Wiederverwendung von Code und Testen zu erreichen.

Wir haben auch die Vorteile der Verwendung eines MVC-Frameworks gesehen, das uns ein grundlegendes MVC-Grundgerüst und eine Vielzahl von Funktionen bietet, die unsere Produktivität verbessern und den Entwicklungsprozess vereinfachen. Danke fürs Lesen!