PHP-Code für Webanwendungen folgt für gewöhnlich einem Muster. Früher war das gerne mal „Spaghetti-Code“, heute folgen viele dem Prinzip des MVC – eine Abkürzung für Model-View-Controller. In diesem Artikel werde ich mit euch ein eigenes kleines „Framework“ entwickeln, dass dieses Prinzip veranschaulicht.
Inhalt
Grundlagen
Begriffsklärung
Model-View-Controller (MVC) bedeutet vor allem die Trennung von Aufgaben. Dabei symbolisieren die einzelnen Teile die drei häufigsten (und egtl. immer vorhandenen) Aufgaben einer Webanwendung. Ich werde mich jedem Buchstaben im Detail widmen und am Ende noch einen Ausblick auf weitere „Buchstaben“ geben.
Der Beispiel-Code zum mitmachen
Der Programmcode für unser Beispiel findet sich auf Github und darf von euch frei kopiert werden: MVC-Example. Im Laufe des Artikels werde ich immer wieder auf die entsprechenden Tags verlinken, die den besprochenen Stand des Codes repräsentieren.
Vorbereitung und index.php
Umleiten aller URLs (z. B. mit mod_rewrite)
Als Einstiegspunkt in eine MVC-Anwendung dient – wie sonst auch – eine index.php
. Alle Anfragen an unseren Server werden dahin umgebogen. Eine entsprechende .htaccess
für Apache könnte also so aussehen:
1 2 3 4 5 |
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?_url=$1 [QSA,L] |
Andere Webserver bieten ähnliche Mechanismen. Wichtig für uns ist, dass die Anfrage auf die index.php
umgeleitet wird und ein Parameter _url
die vom Benutzer tatsächlich eingegebene Adresse enthält.
Damit erreichen wir einen zentralen Einstiegspunkt (die index.php
) in unsere Anwendung, ohne die wichtige Information, welche Seite der Benutzer sehen will zu verlieren.
Autoloader
Irgendwie müssen unsere Klassen noch geladen werden. Da wir uns an PSR-4 halten, genügen folgende Zeilen als Autoloader. Dieser soll sich lediglich um den Namensraum Mvc
kümmern, damit später von uns verwendete Bibliotheken nicht gestört werden.
1 2 3 4 5 6 7 8 9 10 11 12 |
spl_autoload_register(function ($className) { if (substr($className, 0, 4) !== 'Mvc\\') { // not our business return; } $fileName = __DIR__.'/'.str_replace('\\', DIRECTORY_SEPARATOR, substr($className, 4)).'.php'; if (file_exists($fileName)) { include $fileName; } }); |
Nähere Einzelheiten zum Konzept des Autoloader findet ihr ein einem eigenen Beitrag: Autoloader.
Nachdem wir nun die Grundlagen gelegt haben, können wir in die MVC-Struktur einsteigen. Der erste Schritt ist dabei ein Controller: Weiter zum Controller