Michael Korte – Senior Full-Stack Developer Freelancer aus Dortmund

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: