Michael Korte – Senior Full-Stack Developer Freelancer aus Dortmund

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: