View (V)
Die View ist für das Layout zuständig und erledigt somit die Darstellung der Seite. Wir erstellen eine zentrale Klasse namens View, über die die Steuerung erfolgt, und eine Datei pro Aktion im Verzeichnis /views/
. Laut Konvention erstellen wir pro Controller einen Unterordner in /views/
. Die zugehörige View zur Startseite ist also im Pfad /views/index/index.phtml
.
Für unsere Views kann jede beliebige Template-Engine (Twig, Mustache, …) zum Einsatz kommen. Die Kompilierung würde dann in der View::render()
geschehen. Für unser Beispiel soll uns aber HTML mit gelegentlichem PHP genügen (.phtml
).
Der größte Vorteil einer derartigen Trennung von Programmlogiken im Controller und Layout in der View ist, dass sich damit ein Designer auf das Layout konzentrieren kann, ohne vom Rest gestört zu werden.
Die View-Klasse zum jetzigen Zeitpunkt ist denkbar einfach:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
namespace Mvc\Library; class View { protected $path, $controller, $action; public function __construct($path, $controllerName, $actionName) { $this->path = $path; $this->controller = $controllerName; $this->action = $actionName; } public function render() { $fileName = $this->path.DIRECTORY_SEPARATOR.$this->controller.DIRECTORY_SEPARATOR.$this->action.'.phtml'; if (!file_exists($fileName)) { throw new NotFoundException(); } include $fileName; } } |
Zur Auswahl der richtigen Datei, benötigt die View die Namen von Controller und Action, sowie den Pfad zur Andwendung im Dateisystem. Diese Informationen überreichen wir direkt im Konstruktor.
Der Aufruf erfolgt in der index.php
durch zwei Zeilen nach der Action:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
try { if (!class_exists($controllerClassName)) { throw new \Mvc\Library\NotFoundException(); } $controller = new $controllerClassName(); if (!$controller instanceof \Mvc\Controller\Controller || !method_exists($controller, $actionMethodName)) { throw new \Mvc\Library\NotFoundException(); } $controller->$actionMethodName(); $view = new \Mvc\Library\View(__DIR__.DIRECTORY_SEPARATOR.'views', $controllerName, $actionName); $view->render(); } catch (\Mvc\Library\NotFoundException $e) { |
Im Template für die Startseite (/views/index/index.phtml
) steht schließlich der HTML-Code.
1 |
<h1>Hello World</h1> |
Der vollständige Code bis hierher (v0.2)
Wir haben jetzt bereits eine funktionierende Webseite. Allerdings können wir bisher nur statische HTML-Dokumente ausliefern. Wie wir dynamische Inhalte (also Daten) vom Controller zur View weiterreichen sehen wir auf der nächsten Seite.