Zum Inhalt springen

Template-Engines in PHP: Übersicht

Was eine Template-Engine gegenüber purem PHP leistet, welche Ansätze es gibt und wie du für ein konkretes Projekt entscheidest – von vlibTemplate über Smarty bis Twig.

Zuletzt geprüft: Gedacht für: Architekturentscheidung im Projekt

Das Wichtigste

  • PHP ist selbst eine Template-Sprache. Eine Engine bringt Nutzen durch Beschränkung, nicht durch zusätzliche Möglichkeiten.
  • Drei Ansätze: eigene Syntax (Smarty, Twig), Platzhalter mit Kommentar-Blöcken (vlibTemplate), unveränderte HTML-Attribute (TinyButStrong).
  • Automatisches Escaping ist das stärkste Argument. Twig escapet standardmässig, die älteren Engines nicht.
  • Für Bestandsprojekte zählt Wartbarkeit mehr als Eleganz: eine laufende Engine zu ersetzen kostet mehr, als sie zu verstehen.

Die häufigste Kritik lautet: PHP ist selbst eine Template-Sprache, wozu also eine zweite? Das stimmt technisch und geht am Punkt vorbei. Der Nutzen einer Engine liegt nicht darin, mehr zu können, sondern weniger zu erlauben.

Was eine Engine tatsächlich bringt

Trennung durchsetzen. In einer .php-Datei kann jederzeit eine Datenbankabfrage stehen. In einem Template mit eigener Syntax ist das nicht möglich – die Engine kennt keine Datenbank. Das ist eine Einschränkung, und genau darin liegt der Wert.

Automatisches Escaping. Der praktisch wichtigste Punkt. In purem PHP muss jede Ausgabe einzeln durch htmlspecialchars, und ein vergessener Aufruf ist eine XSS-Lücke. Twig escapet standardmässig, ohne dass jemand daran denken muss.

Templates für Nicht-Entwickler. Eine Designerin kann ein Template mit Platzhaltern bearbeiten, ohne PHP zu verstehen. Bei TinyButStrong bleibt die Datei sogar valides HTML und lässt sich in einem visuellen Editor öffnen.

Vererbung und Bausteine. Ein Basistemplate mit definierten Blöcken, das die Einzelseiten überschreiben – das lässt sich in purem PHP nachbauen, aber selten so sauber.

Die drei Ansätze

Eigene Syntax. Smarty und Twig bringen eine eigene Sprache mit geschweiften Klammern mit:

{% for produkt in produkte %}
  <li>{{ produkt.name }} – {{ produkt.preis|number_format(2, ',', '.') }} €</li>
{% endfor %}

Ausdrucksstark, mit Filtern und Vererbung. Der Preis ist eine zweite Sprache, die jeder im Team lernen muss.

Platzhalter mit Blöcken. vlibTemplate arbeitet mit einfachen Platzhaltern und Kommentar-artigen Steuerelementen:

<!-- BEGIN produkte -->
  <li>{NAME} – {PREIS} €</li>
<!-- END produkte -->

Weniger mächtig, dafür in zehn Minuten erklärt. Logik ist bewusst nicht möglich, was die Trennung erzwingt.

Unverändertes HTML. TinyButStrong benutzt HTML-Kommentare und Attribute, sodass die Datei valides HTML bleibt:

<li>[produkte.name] – [produkte.preis] €</li>

Der Vorteil zeigt sich, wenn die Templates von jemandem gepflegt werden, der mit einem visuellen Editor arbeitet.

Entscheidungshilfe

Situationnaheliegende Wahl
Neues Projekt, Framework offenTwig
Symfony oder Drupal im EinsatzTwig (ist ohnehin dabei)
Bestandsprojekt läuft mit Smartybei Smarty bleiben, auf aktuelle Version heben
Bestandsprojekt läuft mit vlibTemplateverstehen und pflegen, nur bei PHP-Inkompatibilität ersetzen
Templates werden von Designern gepflegtTinyButStrong oder Twig
Sehr kleines Projekt, eine Personpures PHP mit alternativer Syntax

Der letzte Fall wird oft übersehen. Für eine Handvoll Seiten ist das hier vollkommen ausreichend:

<ul>
<?php foreach ($produkte as $p): ?>
  <li><?= htmlspecialchars($p['name'], ENT_QUOTES, 'UTF-8') ?></li>
<?php endforeach; ?>
</ul>

Die alternative Syntax mit : und endforeach bleibt zwischen HTML lesbar. Was fehlt, ist das automatische Escaping – jeder <?= ohne htmlspecialchars ist ein potenzielles Loch.

Wenn du eine alte Engine übernimmst

Bestandsprojekte mit vlibTemplate, Smarty 2 oder TinyButStrong laufen häufig seit vielen Jahren. Vor jeder Migrationsentscheidung lohnt sich die nüchterne Prüfung:

  1. Läuft die Engine auf der Ziel-PHP-Version? Das ist die einzige Frage, die eine Migration wirklich erzwingt. Alter Code mit ereg, each oder Konstruktoren im PHP-4-Stil bricht spätestens ab PHP 8.
  2. Gibt es offene Sicherheitslücken? Besonders relevant bei Engines, die PHP-Code im Template zulassen.
  3. Wie oft werden die Templates tatsächlich angefasst? Wer im Jahr drei Änderungen macht, gewinnt durch eine Migration nichts.

Ist die Antwort auf 1 und 2 unkritisch, ist die richtige Entscheidung fast immer: verstehen, dokumentieren, weiterlaufen lassen. Die ausführlichen Anleitungen zu den einzelnen Engines findest du in diesem Bereich – sie sind für genau diesen Fall geschrieben.

Häufige Fragen

Brauche ich überhaupt eine Template-Engine?

Für kleine Projekte reicht PHP mit der alternativen Syntax und konsequentem htmlspecialchars. Eine Engine lohnt sich, sobald mehrere Personen an den Templates arbeiten, Designer ohne PHP-Kenntnisse beteiligt sind, oder du automatisches Escaping erzwingen willst.

Welche Engine ist heute Standard?

Twig. Es wird aktiv entwickelt, escapet standardmässig, ist in Symfony und Drupal verankert und hat mit Abstand die beste Werkzeugunterstützung. Für Neuprojekte ohne besondere Anforderung ist es die naheliegende Wahl.

Lohnt sich die Migration einer alten Engine?

Nur mit einem konkreten Anlass. Eine funktionierende vlibTemplate- oder Smarty-Installation zu ersetzen kostet Wochen und bringt fachlich nichts. Sinnvoll wird die Migration, wenn die Engine auf der Ziel-PHP-Version nicht mehr läuft oder eine Sicherheitslücke offen bleibt.

Kosten Template-Engines Laufzeit?

Beim ersten Aufruf ja, weil das Template geparst wird. Alle ernstzunehmenden Engines kompilieren anschliessend nach PHP und cachen das Ergebnis. Ab dem zweiten Aufruf ist der Unterschied zu purem PHP in der Regel nicht mehr messbar.