Ziel dieses Teils
In Teil 8 haben wir den vollständigen Seitenzustand beschrieben. Jetzt folgt der letzte konzeptionelle Schritt:
Wie wird strukturierter Zustand kontrolliert zu HTML?
Merksatz
Blöcke sind die API zwischen Controller und Template.
Nicht mehr – aber auch nicht weniger.
9.1 Was ein Block ist – und was nicht
Ein Block ist kein:
- Component
- Widget
- View-Model mit Logik
- Mini-Controller
Ein Block ist ausschließlich:
Definition
Ein Block ist ein reiner Datencontainer,
der beschreibt was dargestellt werden soll –
nicht wie.
Ein Block:
- hat keine Methoden
- kennt keine Templates
- erzeugt keinen Output
- enthält keine Logik
9.2 Warum das wichtig ist
In klassischen Systemen entstehen häufig hybride Konstrukte:
- Templates mit Geschäftslogik
- Components mit verstecktem Rendering
- Daten + HTML + Verhalten in einer Einheit
Das Block-System unterbricht dieses Muster bewusst:
- Controller definieren Struktur
- Blöcke transportieren Daten
- Templates erzeugen HTML
Dadurch bleibt jederzeit klar, wo HTML entsteht und wo nicht.
9.3 Block-Konfiguration im Controller
<?php
use Core\PageContext;
return (new PageContext())
->withBlocks([
[
'type' => 'text',
'data' => [
'title' => 'Erster Block',
'content' => 'Hallo aus dem Block-System',
],
],
[
'type' => 'text',
'data' => [
'title' => 'Zweiter Block',
'content' => 'Noch ein Block',
],
],
]);
Der Controller:
- kennt keine Templates
- kennt keinen HTML-Code
- kennt nur Block-Typen und Daten
Reihenfolge, Struktur und Inhalt sind explizit beschrieben.
9.4 Wo der Output tatsächlich entsteht
Der Block selbst erzeugt niemals Output. HTML entsteht ausschließlich hier:
- im Block-Template
- im Renderer
Beispiel: blocks/text.html.twig
<section class="ce-text">
{% if title %}
<h2>{{ title }}</h2>
{% endif %}
<div class="ce-text-content">
{{ content }}
</div>
</section>
Dieses Template ist vollständig.
Es benötigt keine Includes, keine Helpers, keine Logik.
9.5 Rolle des Block-Renderers
<?php
final class BlockRenderer
{
public function render(PageContext $page): string
{
$html = '';
foreach ($page->getBlocks() as $block) {
$html .= $this->view->render(
'blocks/' . $block['type'] . '.html.twig',
$block['data']
);
}
return $html;
}
}
Wichtig:
- keine Bedingungen im Controller
- keine Entscheidungen im Template
- keine Seiteneffekte im Block
9.6 Warum das kein CMS ist
Das Block-System sieht auf den ersten Blick CMS-ähnlich aus – ist aber bewusst etwas anderes:
- keine Editor-Magie
- keine implizite Struktur
- keine versteckte Logik
Es ist ein Code-basiertes Struktur-API, nicht ein Redaktionssystem.
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