Nach unserem ersten Überblick über die neuen redaktionellen Funktionen von Contao 4.4 setzen wir nun die Entwickler-Brille auf: Was hat sich mit Contao 4 geändert? Was ist neu und was ist anders? Und vor allem: Was bringt das Symfony-Framework für Contao-Entwickler?

Contao als Symfony Bundle(s)

Die größte Neuerung ist gleichzeitig der größte Vorteil von Contao 4: Das Content-Management-System wird nun in Form von Symfony-Bundles bereitgestellt und bringt damit automatisch eines der besten PHP-Frameworks als Basis für individuelle Entwicklungen mit.

Eine typische Contao-Webseite besteht dabei neben dem grundlegenden Symfony-Framework in der Regel aus den folgenden Bundles:

  • Core-Bundle
    Das Core-Bundle beinhaltet die Grundfunktionen von Contao und stellt die Basis für das gesamte Content-Management-System (GitHub).
  • Installation-Bundle
    Das Installation-Bundle stellt das gewohnte Installtool bereit, um ein Contao-System auf dem Webserver einzurichten und zu konfigurieren (GitHub).
  • Manager-Bundle und Manager-Plugin
    Seit Version 4.4 bringt Contao mit dem Manager-Bundle und dem Manager-Plugin eine Alternative zur Anbindung des CMS an das Symfony-Framework mit und vereinfacht damit die Migration von Erweiterungen aus älteren Contao-Versionen (GitHub).
  • Erweiterungs-Bundles
    Die hauseigenen Erweiterungen für News, Events, FAQ, Newsletter, Kommentare und Auflistungen werden nun ebenfalls als eigene Bundles bereitgestellt und können modular zum Grundsystem hinzugefügt werden.

Dateistruktur einer Symfony-Anwendung

Durch die Integration in Symfony basiert Contao nun auch auf der vorgegebenen Ordnerstruktur des Frameworks:

  • app/
    Das app/-Verzeichnis beinhaltet die individuelle Konfiguration einer Symfony-Anwendung und stellt in der Regel den AppKernel als Startpunkt der Anwendung bereit. Mit dem Manager-Bundle liefert Contao mittlerweile jedoch einen eigenen Startpunkt, der noch leichter konfiguriert werden kann.
  • bin/
    Das bin/-Verzeichnis beinhaltet normalerweise ausführbare Dateien wie die Symfony-Konsole. Das Manager-Bundle von Contao stellt auch hier eine angepasste Console bereit, so dass ein bin/-Verzeichnis normalerweise nicht notwendig ist.
  • src/
    Im src/-Verzeichnis wird normalerweise der anwendungsspezifische Code hinterlegt. Für die Entwicklung mit Contao ist dieses Verzeichnis jedoch nicht notwendig.
  • tests/
    Im tests/-Verzeichnis werden automatisierte Tests für das System hinterlegt. Die einzelnen Contao-Bundles bringen bereits eigene Tests mit, die in den jeweiligen Bundles zu finden sind.
  • var/
    Unter var/ werden alle generierten Dateien wie Log- und Cache-Dateien abgelegt.
  • vendor/
    Das vendor/-Verzeichnis beinhaltet alle installierten Erweiterungen und Bundles, sowie deren jeweilige Abhängigkeiten. Das Verzeichnis wird über Composer verwaltet.
  • web/
    Das web/-Verzeichnis dient als Hauptverzeichnis für den Aufruf der Anwendung (Document-Root) und stellt somit alle öffentlich aufrufbaren Dateien bereit.

Besonderheiten von Contao

Eine typische Contao-Installation bringt dabei noch vier weitere Verzeichnisse mit, die Entwickler bereits aus früheren Contao-Versionen kennen:

  • assets/
    Das assets/-Verzeichnis beinhaltet verschiedene JavaScript- und CSS-Tools und Frameworks wie jQuery, den TinyMCE-Texteditor und das Chosen-Selectmenü. Das Verzeichnis wird automatisch als Symlink über das web/-Verzeichnis bereitgestellt.
  • files/
    Im files/-Verzeichnis werden alle Dateien und Inhalte gespeichert, die über die Dateiverwaltung von Contao erstellt werden. Freigegebene Daten werden automatisch als Symlinks über das web/-Verzeichnis bereitgestellt.
  • system/
    Über das system/-Verzeichnis können Contao-spezifische Einstellungen und Funktionen bereitgestellt werden. Das Manager-Bundle stellt sicher, dass das Verzeichnis grundsätzlich analog zu älteren Contao-Versionen funktioniert und eine einfache Anpassung und Erweiterung von Contao ermöglicht.
  • templates/
    Im templates/-Verzeichnis können individuelle Templates für Inhaltselemente und Module hinterlegt werden, um den Aufbau ausgewählter Elemente zu überschreiben.

Das Contao-Team hat damit einen sehr guten Mittelweg zwischen der empfohlenen und übersichtlichen Struktur einer Symfony-Anwendung und dem von Contao gewohnten Aufbau gefunden. Und das Beste ist: Dank dem intelligenten Manager-Bundle kann ein Contao-System auch als Symfony-Anwendung weiterhin genauso einfach angepasst und erweitert werden, wie bisher.

Symfony als Basis für moderne Entwicklung

Logo des PHP Frameworks Symfony

Auf den ersten Blick bleibt also alles beim Alten. Doch Contao 4 stellt in Verbindung mit Symfony eine ganze Reihe an Tools bereit, die über die bisherige Contao-Funktionen hinausreichen. Damit wächst Contao von einem reinen CMS zu einer modernen Webanwendung heran, über die individuelle Funktionen jeder Größenordnung nachhaltig und effektiv programmiert werden können.

Komfort-Funktionen für Entwickler

Gerade erfahrenen Entwickler fehlten in Contao 3 noch viele Komfortfunktionen, die mittlerweile zum Standard im Bereich Webentwicklung gehören. So mussten Template-Dateien und individuelle Klassen in der Regel manuell über den Contao-Autoloader registriert werden (solange nicht der NamespaceClassLoader nachinstalliert wurde) und auch die Abhängigkeiten von Erweiterungen mussten oftmals manuell aufgelöst werden.

Mit dem Wechsel zu Symfony wird jede Contao-Anwendung nun vollständig durch den Packetmanager Composer verwaltet und bietet somit eine standardisierte Möglichkeit zur Verwaltung von Abhängigkeiten und zum automatischen Laden von Klassen und Funktionen.

Über lokale Repositories können auch lokale Klassen und Funktionen im Autoloader von Composer registriert werden, was gerade für normale Contao-Module sehr nützlich sein kann.

Auch die Template-Dateien (*.html5-Dateien im templates/-Verzeichnis) eigener Module werden nun automatisch vom System erkannt.

// Before Contao 4, all templates had to be registered manually.
TemplateLoader::addFile('ce_text', 'system/modules/pixlscript/templates');

// With Contao 4, templates get picked up automatically.

Contao 4 im Turbomodus: Performance & Caching

Mit dem Wechsel zu Symfony wurde der bisher manuell von Contao verwaltete interne Cache durch den allgemeinen Anwendungscache von Symfony ersetzt. Im Zusammenspiel mit dem OPcache neuerer PHP-Versionen und dem Composer Classmap Cache erreicht Contao 4 eine superschnelle Performanz für ein CMS und erstellt auch Seiten mit umfangreichen dynamischen Inhalten ohne spürbare Verzögerung.

Development-Modus & Debugging

So schnell Contao 4 im produktiven Modus auch ist - während der Entwicklung möchte man sämtliches Caching in der Regel umgehen, um Änderungen und Anpassungen am System sofort sehen zu können. Dafür bietet Symfony einen zusätzliche Debug- oder Development-Modus, der parallel zum produktiven Modus genutzt werden kann. Neben eigenen Caching-Einstellungen bietet der Development-Modus auch Zugriff auf den Symfony-Debugger, über den umfangreiche Debugging-Informationen eingesehen werden können.

Screenshot der Debug-Bar von Symfony in einer Contao-Anwendung.
Im Symfony-Debugger sind hilfreiche Laufzeitinformationen einer Contao-Anwendung zu finden.

Auch Contao selbst nutzt den Debugger, um Laufzeitinformationen rund um das System und die gerade generierten Inhalte anzuzeigen (ähnlich dem Debug-Modus früherer Contao-Versionen).

Insbesondere interessant sind die Angaben im “Doctrine”-Tab des Debuggers, in dem alle bei der Erstellung der Seite durchgeführten Datenbankabfragen aufgelistet werden. Neben der reinen Anzahl der Abfragen ist auch die Dauer jeder Abfrage ersichtlich, so dass langsame oder optimierbare Datenbankabfragen schnell erkannt und ausgebessert werden können.

Screenshot des Symfony-Debuggers mit Informationen zu Datenbankabfragen.
Im Debugger sind unter Anderem sämtliche Datenbankabfragen einsehbar.

Symfony-Funktionen in Contao nutzen

Auch unter Contao 4 können Erweiterungen weiterhin im “Contao-Stil” als Modul unter system/modules/ angelegt werden und ausschließlich die Funktionen der Contao-Library nutzen. Auf diese Weise werden die großen Vorteile der Integration in Symfony jedoch nur oberflächlich genutzt - viel interessanter ist es, die Funktionen und Tools des gesamten Symfony Frameworks einzusetzen.

Um aus Contao heraus auf alle verfügbaren Komponenten und Bundles zugreifen zu können, kann Symfony’s hervorragende Dependency Injection genutzt werden. Am einfachsten geht das über den Service Container, der komfortabel über die globale System-Klasse von Contao abgerufen werden kann.

Hier ein einfaches Beispiel, um Einstellungen der Symfony-Anwendung auslesen zu können:

// Access the Symfony container through Contao's System class.
$container = \System::getContainer();

// Check if debug mode is enabled.
$container->getParameter('kernel.debug');

// Get the current locale.
$container->getParameter('locale');

// Get Contao specific parameters.
$container->getParameter('contao.upload_path');

Über den Service Container können auch sämtliche verfügbaren Dienste geladen und genutzt werden:

// Get Contao's Simple Cache (e.g. FilesystemCache)
$cache = $container->get('contao.cache');

// Use the service to cache some data for 1 day.
$cache->set('Key', $data, 60 * 60 * 24);

// Read data from the cache.
$data = $cache->get('Key');

Insgesamt haben Entwickler unter Contao 4 damit eine sehr breite Palette an Werkzeugen zur Auswahl, mit denen sich auch umfangreiche Anforderungen komfortabel und auf Basis moderner Standards programmieren lassen.

Unser Fazit: Traumpaar Contao & Symfony

Das Contao-Team hat mit Contao 4 einen großen Schritt in Richtung moderner Webentwicklung gemacht. Auch wenn das CMS selbst vermutlich erst ab Version 5 wirklich alle eigenen Funktionen auf Basis von Symfony abwickeln wird, ist Contao 4 gerade in Verbindung mit dem Manager-Bundle eine sehr gute Verschmelzung der Contao-typischen intuitiven Struktur mit der Macht eines professionellen Frameworks.

Dieser Artikel ist Teil der Serie "Contao 4".
Weitere Artikel zum Thema:
  1. Contao 4.4 für Redakteure: Unsere Highlights
  2. Contao 4.4 für Entwickler: Moderne Webentwicklung mit Symfony
Interessant? Weitersagen!

Interessanter Artikel? Wir haben noch mehr!