Ziel dieses Teils
Bis hierhin haben wir:
- einen klaren Request-Lifecycle
- Routing als Entscheidung
- Controller als Orchestratoren
- PageContext als Seitenzustand
Was noch fehlt, ist der letzte Schritt: die eigentliche Ausgabe.
Harte Regel
HTML entsteht genau einmal – im Renderer.
Nicht davor. Nicht daneben. Nicht aus Versehen.
6.1 Wo HTML in klassischen MVC-Systemen entsteht
In vielen MVC-Setups gibt es mehrere Orte, an denen HTML (oder Teile davon) entstehen können:
- direkt im Controller
- in Views und Partial-Views
- in Layouts
- in Helpers oder Services
- in Error-Handlern
- in Plugins / Hooks
Typisches Problem
HTML ist da – aber niemand weiß später sicher, woher genau es kommt und warum es so aussieht.
Genau hier setzt Clean-Output-MVC an.
6.2 Die Konsequenz: ein einziger Output-Ort
Clean-Output-MVC erlaubt genau einen Ort, an dem HTML entstehen darf:
- den Renderer
Alle anderen Schichten liefern ausschließlich Beschreibung, nicht Darstellung.
Merksatz
Controller beschreiben Seiten.
Renderer erzeugt Seiten.
6.3 Rolle des Renderers
Der Renderer ist die einzige Instanz, die:
- PageContext liest
- Templates auswählt
- Assets zusammenführt
- Statuscodes setzt
- HTML ausgibt
Er besitzt keine Fachlogik und trifft keine Entscheidungen.
6.4 Minimaler Renderer (konzeptionell)
<?php
namespace Core;
final class Renderer
{
public function render(PageContext $page): string
{
// HTTP-Status
http_response_code($page->getStatus());
// Assets vorbereiten
$this->renderAssets($page);
// Template rendern
return $this->view->render(
$page->getTemplate(),
$page->getData()
);
}
}
Wichtig ist nicht die Implementierung, sondern die exklusive Verantwortung.
6.5 Kritische Frage: „Was ist mit Metas?“
Eine der häufigsten Reaktionen an dieser Stelle:
Typische Frage
„Was ist, wenn ich die Meta-Description ändern will?
Oder wenn sie von mehreren Stellen beeinflusst wird?“
Die Antwort liegt im Konzept des PageContext:
- Metas sind Teil des Seitenzustands
- Sie werden gesetzt, nicht gerendert
- Der Renderer liest sie aus – mehr nicht
Wenn sich eine Meta-Angabe ändert, gibt es genau eine Frage:
Debugging-Frage
Wer hat den PageContext zuletzt verändert?
Kein Suchen in Templates. Kein Durchforsten von Hooks. Kein „vielleicht kommt es von dort“.
6.6 Vergleich: Warum das deterministisch ist
In vielen Frameworks ist Output bedingt deterministisch:
- Reihenfolge von Events spielt eine Rolle
- Plugins können spät eingreifen
- Templates können Logik enthalten
In Clean-Output-MVC gilt:
- PageContext ist die einzige Wahrheit
- Renderer ist der einzige Output-Ort
- Reihenfolge ist fest definiert
Das ist Determinismus.
Nicht „es funktioniert meistens“, sondern:
Es kann nur so funktionieren.
Zwischenstand
Das System ist jetzt vollständig:
- Index → Bootstrap → App
- Router → Controller
- PageContext
- Renderer → HTML
Bewusste Einschränkung
Das System fühlt sich strenger an, weil es weniger Abkürzungen erlaubt.
Projekt & Quellcode
Der Bootstrap und der Einstiegspunkt sind im Repository vollständig nachvollziehbar umgesetzt:
- 👤 GitHub-Profil: github.com/MichaelKorte73
- 📦 Projekt-Repository: github.com/MichaelKorte73/CleanOutputMVC