Hans Wittwer

Geschichten, die das Leben schrieb

Hinweise

MVC (Model-View-Controller)

🏁

Theorie

Zusammenfassung

MVC ist ein Ansatz, wie Programme organisiert werden können. Die Idee besteht darin, Präsentation, Logik und Datenbankzugriff in drei Gruppen zu teilen, damit das Projekt übersichtlicher und wartungsfreundlicher wird.

M steht für Modelle, diese sind zuständig für den Zugriff zur Datenbank.

V steht für Views (Sichten), diese sind zuständig für die Darstellung des berechneten Resultats.

C steht für Controller (Regler), diese berechnen das Resultat.

Vorgeschaltet ist der Frontcontroller, der die Anfrage entgegennimmt und den Router anfragt, welcher Controller an gekickt werden soll. Der Frontcontroller ist bei PHP-Projekten die Datei index.php. Per Datei .htaccess werden sämtliche Anfragen zu dieser Datei geleitet.

Der Controller redet mit dem Modell, erhält die Daten, berechnet das Resultat und fragt den View, wie das Resultat angezeigt werden soll.

Für kleine Aufgaben darfst Du gerne auf MVC verzichten und weiterhin nach Lust und Laune coden, denn MVC bringt einen Overhead mit und ist für grössere Projekte ein gangbarer Weg.

Struktur

Weil mit Namensräumen und automatischem Laden der Klassen gearbeitet wird, müssen die Verzeichnisse und Dateinamen zu den Namensräumen passen, ansonsten streikt der Autolader.

Siehe auch im Hinweis Namespace, Autolader und Verzeichnis

Zudem werden neue und leistungsfähige Funktionen verwendet, um vor dem Start einer Klasse automatisch in der Klasse nachzusehen, welche Parameter der Klasse übergeben werden müssen. Für Neulinge eine happige Anforderung, diese Mechanik auf Anhieb zu begreifen.

Auch der Router mit seinen unzähligen und komplexen regulären Ausdrücken ist eine Herausforderung.

Im Internet gibt es hervorragende Kurse zu diesem Thema, mit gegen 200 Lektionen.

Viel Spass und Ausdauer wünsche ich Dir!

Verzeichnisbaum

Im Wurzelverzeichnis der Website ist die Datei .htaccess, die auf die gewünschte Startdatei «public/$1» umleitet. Der Rest ist in den Verzeichnissen config, public, src, tmp und views untergebracht.

Die ganze Geschichte intus zu haben, braucht Übung. Die grobe Zusammenfassung soll Dir einen Einblick geben. Wenn Du es anwenden möchtest, empfehle ich Dir Dave Hollingworth, er hat den grossartigen Kurs php-mvc-from-scratch zum Selbststudium via Udemy publiziert. Sein Kurs habe ich gemacht und meine Zusammenfassung basiert auf diesem Kurs. Schau dort mal rein …

MVC step by step with PHP

Zusammenfassung

Erfahrungsbericht nach Anwendung des Gelernten aus dem hervorragenden Kurs php-mvc-from-scratch  von Dave Hollingworth.

Erfahrungsbericht
Aufrufe und deren Umleitung

Eindrücklich ist die Genialität, beinahe alle Aufrufe an den Frontcontroller umzuleiten.

Wieso nur beinahe alle? Es werden sämtliche Aufrufe in das öffentliche Verzeichnis umgeleitet. Im öffentlichen Verzeichnis werden alle Aufrufe nur dann an den Frontcontroller geleitet, wenn das aufgerufene Verzeichnis und die aufgerufene Datei nicht existieren. Etwa Browser kommen mit derartigen Aufrufen daher, um Bilder anzufordern.

Alle anderen Aufrufe werden dem Frontcontroller gefüttert.

Frontcontroller

Der Frontcontroller:

  1. Erzwingt die strikte Variabelndeklaration
  2. Startet die Sitzung
  3. Merkt sich das öffentliche Verzeichnis
  4. Nimmt den Autolader in Betrieb
  5. Holt sich die Datenbankparameter
  6. Setzt den Ausnahmenmanager
  7. Erzeugt den Router (Array)
  8. Erzeugt den Container (Objekt)/li>
  9. Erzeugt die Middleware (Array)
  10. Erzeugt den Dispatcher (Objekt) mit Router, Container und >Middleware> als Parameter.
  11. Erzeugt die Anforderung (Objekt)
  12. Verlangt vom Dispatcher mit der Anforderung als Parameter die Antwort
  13. Sendet die Antwort an den Aufrufer
Router

Der Router ist ein Array aller zulässigen Links mit jeweils den passenden Parametern.

Etwa "/", [ "controller" => "home", "action" => "index", "middleware" => "login" ];

Im Grunde kann es Hunderte von gültigen Links geben, doch mithilfe von regulären Ausdrücken lassen sich die gültigen Varianten extrem zusammenfassen, etwa:

"/{controller}/{id:\d+}/show", [ "action" => "show", "middleware" => "login|message|test" ]

Wie das genau geht, erfährst Du im Kurs bei Dave.

Container

Der Container ist der Container eben. Den habe ich noch nicht durchschaut.

Middlewarer

Die Middleware ist ein Array mit Umleitungen, etwa:

"login" => \App\Middleware\RedirectLogin::class

Erfordert, dass Du Dich anmeldest, falls Du nicht schon angemeldet bist.

Controller

Pro Menüpunkt gibt es einen Controller. Der Controller ist im Verzeichnis src/App/Controllers und hat den Namen des Menüpunktes in der Mehrzahl, etwa src/App/Controllers/Hinweise.php und verwendet die Elternklasse src/Framework/Controller.php und kann zusätzlich eigene Methoden bekommen.

Der Controller berechnet, holt sich Daten via Modell und liefert das Resultat entsprechend dem View. Pro Aktion hat der Controller Methoden, die gängigsten bezieht er aus der Elternklasse.

Modell

Pro Controller gibt es ein Modell. Das Modell ist im Verzeichnis src/App/Models und hat den Namen des Controllers in der Einzahl, etwa src/App/Models/Hinweis.php und verwendet die Elternklasse src/Framework/Model und kann eigene Methoden erhalten.

Das Modell liest und schreibt in die Datenbank und bedient den Controller. Pro Auftrag vom Controller hat das Modell eine Methode, die gängigsten bezieht es aus der Elternklasse.

View

Pro Controller gibt es ein Verzeichnis

views/Controllername

Darin sind pro Methode Views gespeichert, etwa: views/Home/index.mvc.php

Fazit

Skripte auf die Schnelle mit Spezialtricks, noch ohne MVC-Framework. Ich habe zwar bei Dave hervorragende Technik kennengelernt, aber die ist mir noch zu hoch. Mit MVC wird’s knackig. Es ist schon so, dass Projekte mit MVC extrem wartungs- und erweiterungsfreundlich werden. Aber man wird schon gezwungen, strukturiert zu arbeiten. Ich denke, für Datenverwaltung mit Datenbanken und strukturierter Darstellung ist das MVC-Framework brillant. Mal so etwas Spezielles ausprobieren, kaum. Einfach so frei von der Leber etwas erfinden? Trotzdem, ich übe weiter, eventuell verstehe ich die Finessen im Laufe der Zeit.

Zurück zum Inhaltsverzeichnis