TYPO3 Content Blocks und PHP 8.4 Property Hooks: Weniger Code, mehr Kontrolle

Wie YAML-Definitionen und PHP 8.4 Property Hooks zusammen bis zu 80% Boilerplate eliminieren – für bessere DX und KI-Lesbarkeit.

Wer TYPO3-Extensions entwickelt, kennt das Szenario: Ein neues Datenbankfeld bedeutet Änderungen an fünf verschiedenen Stellen – ext_tables.sql, TCA-Konfiguration, Domain-Model, Repository und Fluid-Template. Das kostet Zeit, provoziert Inkonsistenzen und macht Wartung zum Geduldspiel.

Die gute Nachricht: Zwei moderne Ansätze eliminieren diesen Overhead: Content Blocks für deklarative Datenstrukturen und PHP 8.4 Property Hooks für schlanke Domain-Models. Zusammen reduzieren sie Boilerplate um bis zu 80%.

Was Sie in diesem Artikel lernen
  • Wie Content Blocks TCA, SQL und Backend-Formulare aus einer YAML-Datei generieren
  • Wie PHP 8.4 Property Hooks klassische Getter/Setter ersetzen
  • Wann Sie Content Elements und wann Record Types einsetzen
  • Warum beide Ansätze die KI-Lesbarkeit Ihrer Codebase verbessern

Terminologie 

Bevor wir starten, eine kurze Begriffsklärung:

BegriffBedeutung
Content BlocksDie Extension, die Code für die TYPO3 Core API generiert
Content BlockEine einzelne Konfigurationseinheit, die genau einen Content Type definiert
Content TypeEine Entität in TYPO3 mit definierten Feldern und Verhalten
Content ElementContent Type mit Frontend-Rendering (in tt_content)
Record TypeGenerischer Content Type für strukturierte Daten
Page TypeContent Type, der das Verhalten einer Webseite definiert

Was Sie sich konkret ersparen 

Zunächst ein Überblick: Was bringt Ihnen der Umstieg auf Content Blocks tatsächlich?

Aufwand: Klassisch vs. Content Blocks + PHP 8.4

Relativer Aufwand in Prozent – 1% steht für vollständig automatisiert (kein manueller Aufwand). Kleiner ist besser.

AufgabeKlassischContent BlocksReduktion
Neues Feld hinzufügen4-5 Dateien1 YAML-Datei~80%
TCA-KonfigurationManuell (50-100 Zeilen)Automatisch generiert100%
SQL-Schemaext_tables.sql pflegenAutomatisch generiert100%
Neues Content Element30-60 Min.< 5 Min. (CLI)~90%
Feld-Typ ändernTCA + SQL + Model1 Zeile YAML~95%
Getter/Setter (PHP 8.4)~20 Zeilen/FeldProperty Hook (3 Zeilen)~85%
Das Ergebnis

Ein typisches Content Element mit 5 Feldern reduziert sich von ~300 Zeilen Boilerplate auf ~40 Zeilen deklarative YAML-Definition. Die Wartung wird planbar, Fehlerquellen sinken drastisch.


Content Blocks installieren 

Die Installation erfolgt in wenigen Schritten – je nach Setup über Composer oder den Extension Manager.

Bash
# Content Blocks Extension installieren
composer require friendsoftypo3/content-blocks

# Caches leeren und Datenbank aktualisieren
vendor/bin/typo3 cache:flush -g system
vendor/bin/typo3 extension:setup
Sicherheitshinweis für Classic Mode

Im Classic Mode ist es essenziell, den Zugriff auf den ContentBlocks-Ordner über den Webserver zu blockieren. Andernfalls könnten interne Konfigurationsdateien öffentlich zugänglich sein.


Neue Content Types per CLI erstellen 

Das make:content-block-Kommando – inspiriert von der bewährten EXT:make Extension – generiert die komplette Grundstruktur für einen neuen Content Block in Sekunden.

Interaktiver Modus 

Bash
# Starten Sie den Wizard – er führt Sie durch alle Optionen
vendor/bin/typo3 make:content-block

Direkter Aufruf mit Parametern 

Bash
# Content-Element in einem Rutsch erstellen
vendor/bin/typo3 make:content-block \
  --content-type="content-element" \
  --vendor="webconsulting" \
  --name="team-member" \
  --title="Team Member" \
  --extension="my_sitepackage"

Verfügbare Optionen 

OptionBeschreibungBeispiel
--content-typeArt des Content Typescontent-element, page-type, record-type
--vendorVendor-Name (lowercase, kebab-case)webconsulting
--nameName des Content Blocksteam-member
--extensionHost-Extension für den Content Blockmy_sitepackage
--titleAnzeigename im BackendTeam Member
--skeleton-pathPfad zu Custom-Templatescontent-blocks-skeleton

Nach der Erstellung 

Bash
# Caches leeren (wichtig!)
vendor/bin/typo3 cache:flush -g system

# Datenbank-Schema aktualisieren
vendor/bin/typo3 extension:setup --extension=my_sitepackage
Tipp: Skeleton-Templates

Mit --skeleton-path können Sie eigene Vorlagen definieren. Ideal für Teams, die einheitliche Strukturen über alle Content Blocks hinweg durchsetzen möchten.


Das Problem: Fragmentierte Wahrheit 

In klassischen TYPO3-Extensions verteilt sich die Definition eines einzelnen Feldes über mehrere Dateien:

Traditionell: Ein Feld, fünf Anpassungen

Jede Änderung erfordert manuelle Synchronisation. Vergessen Sie eine Stelle, entstehen Diskrepanzen zwischen Datenbankschema und Backend-Formular – ein klassischer Nährboden für Bugs.


Die Lösung: YAML als Single Point of Truth 

Mit der Content Blocks Extension definieren Sie Struktur, Typ und Validierung an einer einzigen Stelle. Die Extension generiert daraus automatisch:

Datenbank-Spalten

Automatische Erstellung der SQL-Struktur basierend auf Ihren Felddefinitionen.

TCA-Konfiguration

Backend-Formulare werden direkt aus der YAML-Definition abgeleitet.

Frontend-Daten

Strukturierte Datenbereitstellung für Fluid-Templates ohne manuelles Mapping.

Der zentrale Vorteil 

FeatureKlassischContent Blocks
Änderungsstellen pro Feld4-5 Dateien1 YAML-Datei
Risiko von Inkonsistenzen
Automatische TCA-Generierung
Automatische SQL-Generierung
WartungsaufwandHochMinimal

Warum Single Source of Truth in Zeiten von KI-Agents unverzichtbar ist 

In einer Ära, in der KI-gestützte Coding-Agents zunehmend Code analysieren, erweitern und refaktorieren, wird die Struktur einer Codebase zum entscheidenden Erfolgsfaktor. Studien zeigen: 65% der Entwickler:innen erleben fehlenden Kontext beim Refactoring – ein Problem, das sich mit fragmentiertem Code potenziert.

Für KI-Agents

Eine zentrale YAML-Definition ermöglicht es Tools wie Cursor oder Claude, die gesamte Datenstruktur in einem Durchgang zu erfassen. Kein Springen zwischen TCA, SQL und Model-Dateien – der Agent versteht sofort, was definiert ist.

Für Entwickler:innen

Developer Experience (DX) beschreibt die Gesamtheit aller Interaktionen mit Tools, Prozessen und Code. Laut Gartner erreichen Teams mit hoher DX 33% häufiger ihre Geschäftsziele und zeigen 20% geringere Fluktuation.

"AI agents rely on the context provided by the codebase to generate relevant code. A poorly organized codebase can lead to 'context rot,' where the agent misses dependencies and produces suboptimal code."

PropelCode: Structuring Codebases for AI Tools

Kernaussage

Das DRY-Prinzip und Single Source of Truth sind keine abstrakten Best Practices mehr – sie sind die Voraussetzung dafür, dass KI-Agents Ihre Codebase produktiv erweitern können.


Code-Beispiel: Team-Mitglied als Content Element 

Definieren Sie ein Content Element für Teammitglieder – eine YAML-Datei genügt:

YAML
# ContentBlocks/ContentElements/team-member/config.yaml
name: vendor/team-member
title: Team Member
description: Display a team member profile

fields:
  - identifier: full_name
    type: Text
    label: Full Name
    required: true
    
  - identifier: position
    type: Text
    label: Position / Role
    
  - identifier: email
    type: Email
    label: Email Address
    
  - identifier: biography
    type: Textarea
    label: Short Biography
    enableRichtext: true
Deklarativ statt imperativ

Sie beschreiben was Sie brauchen, nicht wie TYPO3 es intern verarbeiten soll. Das macht Extensions sauberer, portabler und zukunftssicher.


Record Types: Eigene Datensätze definieren 

Die Content Blocks Extension eignet sich nicht nur für Content Elements in tt_content. Mit Record Types erstellen Sie eigene Datenbanktabellen – ideal für News, Produkte, Events oder andere strukturierte Daten.

Content Elements vs. Record Types 

FeatureContent ElementsRecord Types
Tabellett_contentNeue oder bestehende Tabelle
RenderingDirekt auf der SeiteVia Plugin oder eigenes Template
PlatzierungIm SeiteninhaltIn Ordnern (SysFolders)
AnwendungsfallVisuelle SeitenkomponentenStrukturierte Datensätze
BeispieleHero, Akkordeon, Tabs, CTANews, Produkte, Events, Standorte
OrdnerContentBlocks/ContentElements/ContentBlocks/RecordTypes/
Record Types können bestehende Tabellen erweitern

Mit typeName fügen Sie eigene Typen zu bestehenden Tabellen hinzu – z.B. einen Custom-News-Typ für tx_news_domain_model_news.

Extbase-kompatible Tabellenbenennung 

Wichtig: Für die nahtlose Integration mit Extbase-Repositories verwenden Sie die Namenskonvention tx_extensionkey_domain_model_*. Nur so funktionieren Model-Generatoren und Repositories korrekt.

YAML
# Extbase-kompatible Benennung
table: tx_mysitepackage_domain_model_news

Beispiel: News-Artikel als Record Type 

Ein vollständiges News-System in einer YAML-Datei:

YAML
# ContentBlocks/RecordTypes/news-article/config.yaml
name: myvendor/news-article
table: tx_mysitepackage_domain_model_news
labelField: title
languageAware: true
sortable: true
softDelete: true
trackCreationDate: true
trackUpdateDate: true
restriction:
  disabled: true
  startTime: true
  endTime: true
security:
  ignorePageTypeRestriction: true
fields:
  - identifier: title
    type: Text
    required: true
  - identifier: teaser
    type: Textarea
  - identifier: bodytext
    type: Textarea
    enableRichtext: true
  - identifier: image
    type: File
    allowed: common-image-types
    maxitems: 1
  - identifier: publish_date
    type: DateTime
  - identifier: author
    type: Text
Was Sie sich sparen

Für diesen News-Record Type hätten Sie klassisch ~150 Zeilen TCA, ~20 Zeilen SQL und separate Model- und Repository-Klassen benötigt. Mit Content Blocks: eine YAML-Datei.


PHP 8.4: Property Hooks ersetzen Getter & Setter 

Ein erheblicher Teil klassischer Extbase-Models besteht aus repetitiven Getter- und Setter-Methoden. PHP 8.4 Property Hooks ändern das fundamental.

Der Paradigmenwechsel 

PHP
<?php
declare(strict_types=1);

namespace Vendor\TeamExtension\Domain\Model;

class TeamMember
{
    // Einfache Property ohne Logik – kein Hook nötig
    public string $position = '';
    
    // Property mit Transformations-Logik
    public string $fullName {
        get => strtoupper($this->fullName);
        set(string $value) => $this->fullName = trim($value);
    }
    
    // Property mit Validierung
    public string $email {
        set(string $value) {
            if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
                throw new \InvalidArgumentException('Invalid email format');
            }
            $this->email = strtolower($value);
        }
    }
    
    // Virtuelle Property – keine Datenbank-Spalte
    public string $slug {
        get => str_replace(' ', '-', strtolower($this->fullName));
    }
}

Konkrete Vorteile von Property Hooks 

AspektPHP 8.3PHP 8.4
Code-Zeilen (Beispiel oben)~35 Zeilen~25 Zeilen
Logik-LokationIn separaten MethodenDirekt an der Property
Virtual PropertiesNur über GetterNative Unterstützung
LernkurveBekanntes PatternNeues Konzept
Kompatibilität beachten

Property Hooks sind ein PHP 8.4 Feature. Projekte auf PHP 8.3 oder älter benötigen weiterhin klassische Getter/Setter. Planen Sie Ihr Upgrade entsprechend.


Was Property Hooks ermöglichen 


Die Synergie: Content Blocks + Property Hooks 

Die Kombination beider Technologien führt zu einer klaren Aufgabenteilung:

Statt 300 Zeilen Boilerplate: 40 Zeilen YAML + optionale Geschäftslogik

Das Ergebnis:

  • YAML definiert die Datenstruktur (Single Point of Truth)
  • PHP Models enthalten nur noch Geschäftslogik (Property Hooks)
  • Kein Boilerplate mehr für TCA, SQL oder triviale Getter/Setter
Praxisbeispiel: 2 Dateien statt 5

butu demonstriert in seiner wp_cbexample Extension eindrucksvoll: 4 vollständige Domain Models mit nur einer einzigen manuellen TCA-Datei (für die Plugin-Registrierung). Neue Properties erfordern Änderungen an nur 2 Dateien: config.yaml und Model.php.


Weitere CLI-Befehle im Überblick 

Content Blocks bietet neben make:content-block weitere nützliche Kommandos:

BefehlFunktion
content-blocks:listListet alle registrierten Content Blocks auf
content-blocks:language:generateGeneriert Sprachdateien für alle Felder
content-blocks:assets:publishPubliziert Assets (CSS/JS) in den öffentlichen Ordner
Bash
# Alle Content Blocks anzeigen
vendor/bin/typo3 content-blocks:list

# Sprachdateien generieren
vendor/bin/typo3 content-blocks:language:generate

# Assets publizieren
vendor/bin/typo3 content-blocks:assets:publish

Internationalisierung (i18n) 

Content Blocks vereinfacht die Mehrsprachigkeit erheblich. Labels und Übersetzungen leben in einer labels.xlf im Content Block-Ordner.

Ordnerstruktur 

ContentBlocks/ContentElements/hero-banner/
├── config.yaml
├── language/
│   ├── labels.xlf          # Standardsprache
│   └── de.labels.xlf       # Deutsche Übersetzung
└── templates/
    └── frontend.html

Labels in Templates verwenden 

HTML
<!-- Zugriff auf labels.xlf -->
<f:translate key="{cb:languagePath()}:my_label"/>

<!-- Label aus anderem Content Block -->
<f:translate key="{cb:languagePath(name: 'vendor/other-block')}:shared_label"/>

Record Types mehrsprachig machen 

Für Record Types aktivieren Sie languageAware in der config.yaml:

YAML
name: myvendor/news-article
table: tx_mysitepackage_domain_model_news
labelField: title
languageAware: true   # Aktiviert Übersetzungsfelder
CLI-Befehl für Sprachdateien

Mit vendor/bin/typo3 content-blocks:language:generate generieren Sie automatisch labels.xlf für alle definierten Felder.


Tooling und Ressourcen 

Beispiel-Extension von butu

Die wp_cbexample Extension von butu zeigt eindrucksvoll, wie Content Blocks und PHP 8.4 Property Hooks in der Praxis zusammenspielen: 4 Models, nur 1 manuelles TCA-File. Ein ausgezeichnetes Proof of Concept für moderne TYPO3-Entwicklung.

Agent Skills

Das Content Blocks Skill für Cursor und Claude Code enthält detaillierte Prompts und Beispiele für Content Elements, Record Types und Migrationen.

wp_make Extension

Die wp_make Extension generiert Extbase-Models und Repositories passend zu Ihren Content Blocks Record Types.

Offizielle Dokumentation

Die TYPO3 Content Blocks Dokumentation bietet die vollständige YAML-Referenz und API-Beschreibung.


Fazit: Jetzt handeln, später profitieren 

Sofort umsetzbar

Content Blocks funktionieren bereits mit aktuellen TYPO3-Versionen. Starten Sie neue Extensions direkt mit dem deklarativen Ansatz.

Zukunftssicher

Wir empfehlen diesen Ansatz: PHP 8.4 Property Hooks kombiniert mit Content Blocks bieten bereits jetzt erhebliche Vorteile – und eine mögliche Core-Integration in TYPO3 v14 würde diese Investition zusätzlich absichern.

Die Kombination aus TYPO3 Content Blocks und PHP 8.4 Property Hooks reduziert nicht nur den initialen Entwicklungsaufwand – sie macht Ihre Extensions grundlegend wartbarer.

Kontaktieren Sie uns für ein unverbindliches Gespräch.

E-Mail: office@webconsulting.at

Lassen Sie uns über Ihr Projekt sprechen

Standorte

  • Mattersburg
    Johann Nepomuk Bergerstraße 7/2/14
    7210 Mattersburg, Austria
  • Wien
    Ungargasse 64-66/3/404
    1030 Wien, Austria

Dieser Inhalt wurde teilweise mithilfe von KI erstellt.