Smarty
Die Template Engine Smarty ist eine quelloffene (LGPL) PHP-Bibliothek, die bei der Entwicklung von Webapplikationen die Trennung von Code und Ausgabe ermöglicht. Die Ausgabe ist dabei in der Regel HTML, kann aber jedes textbasierte Dateiformat sein, also z. B. auch XML.
Was ist Smarty?
Besonders Anfänger der PHP-Programmierung neigen dazu, operativen Programmcode (z. B. den Code für Berechnungen oder Dateioperationen) und ausgabebezogenen Programmcode (z. B. HTML-/XML-Code) innerhalb ihrer Programme zu vermischen, wodurch der Code unübersichtlich wird. Daraus resultieren lange PHP-Dateien, die viele Ausgabebefehle (echo oder printf) enthalten, die sich oft über viele Programmzeilen erstrecken. Die PHP-Programme werden dadurch schnell unübersichtlich und schwerer wartbar. Bei der Entwicklung von Webapplikationen empfiehlt es sich, Code und Ausgabe (im weiteren Text nur noch als XHTML bezeichnet) strikt voneinander zu trennen. Insbesondere bei größeren Applikationen bietet diese Maßnahme erhebliche Vorteile:
- Code und Layout können getrennt (d.h. auch von verschiedenen Personen) parallel entwickelt werden.
- Sowohl PHP- als auch XHTML-Code bleiben übersichtlicher, als wenn sie miteinander vermischt würden.
- Einfache Wiederverwendbarkeit des Codes (z. B. braucht man für dieselbe Applikation mit einem anderen Layout oder Context nur den XHTML-Code zu ändern).
Die oben beschriebene strikte Trennung von Programm- (PHP-Code) und Ausgabecode (XHTML-Code) verbessert die Struktur der Programme und senkt den Aufwand für spätere Layoutanpassungen wesentlich. Im optimalen Fall könnten Programmierer und Webdesigner sogar parallel und weitgehend unabhängig voneinander arbeiten, ohne dass der Programmierer sich mit den Untiefen von XHTML und CSS beschäftigen, oder der Webdesigner PHP lernen, und sich mit komplizierten Algorithmen herumschlagen müsste.
Smarty ist eine quelloffene PHP-Bibliothek und ermöglicht genau diese Trennung zwischen PHP-Code und XHTML-Ausgabe. Um auch in den Templates eine gewisse Steuerbarkeit zu ermöglichen, erkennt Smarty neben den Templatevariablen auch einige einfache Steuerbefehle, die stark an die Syntax von PHP angelehnt wurden und die Formulierung von Bedingungen (if
) oder Schleifen (foreach
) erlauben.
Smarty wurde für den professionellen Einsatz optimiert und enthält eine Art Compiler, der die Ausgabe der Smarty-Templates vorbereitet und in einem Cache speichert. Dadurch wird die Ausgabe stark beschleunigt.
Smarty unterliegt der LGPL (Lesser General Public License), einer Open-Source Lizenz für Programmbibliotheken, und kann dadurch beliebig erweitert und angepasst werden.
Performance
Technische Performance
Smarty verarbeitet die Daten und Templates in zwei Schritten, was die Verarbeitung massiv beschleunigt:
- Zunächst wird aus PHP- und XHTML-Code automatisch und für den Programmierer transparent eine neue PHP-Datei generiert, die sowohl XHTML als auch PHP enthält – also das, was ein Programmierer ohne Templates sonst selbst machen würde. Nur wenn sich eine PHP-Datei ändert, wird die temporäre PHP-Datei aktualisiert. Dadurch braucht das Template nicht bei jedem Seitenaufruf neu geparst zu werden.
- Bei Bedarf kann Smarty auch die endgültige XHTML-Ausgabe zwischenspeichern (engl. cachen). Das bedeutet, dass der Webserver praktisch bei einem Zugriff eine statische XHTML-Seite liefert, was besonders bei Datenbankzugriffen in PHP eine massive Entlastung des Servers und der Datenbank bedeutet. Der Programmierer hat dabei nur zu beachten, dass nach einer Aktualisierung der Datenbank der Cache gelöscht wird. Dies ist insbesondere deshalb günstig, da Datenbanken in vielen Fällen sehr viel öfter abgefragt als verändert werden.
Aus dem ersten Punkt ergibt sich, dass eine SMARTY-basierte Ausgabe niemals schneller sein kann, als eine reine PHP-Ausgabe. Im optimalen Fall (ohne Schleifen) und im Cache-Modus
Entwicklungs-Performance
Die Entwicklungsgeschwindigkeit von Projekten, die SMARTY (oder allgemein Templatesysteme) verwenden kann deutlich über der reiner PHP-Lösungen liegen. Dies ist insbesondere dann der Fall, wenn sich Programmierer und Designer bei großen Projekten in die Quere kommen und es zu Bearbeitungsengpässen kommen kann. Dann ermöglicht eine saubere Trennung von Code und Templates Arbeitsteilung und diese wirkt sich in der Regel produktivitätssteigernd auf das Gesamtprojekt aus.
Hier gilt es von Fall zu Fall Kosten und Nutzen abzuwägen. Bei kleinen Projekten könnte der Aufwand für die Schulung der Designer über dem Nutzen der Arbeitsteilung liegen. Außerdem existieren zahlreiche andere Lösungen, um die Arbeitsteilung während des Projekts zu gewährleisten (s.u.).
Beispielcode
Die Einbindung von SMARTY in PHP ist sehr einfach:
<?php require_once( '/smarty/libs/Smarty.class.php' ); $my_smarty = new Smarty(); $my_smarty->security = true; $my_smarty->secure_dir = '/templates'; $my_smarty->compile_dir = '/smarty_cache'; $my_smarty->left_delimiter = '{..'; $my_smarty->right_delimiter = '..}'; $my_smarty->debugging = false; ?>
Es muss ein Objekt angelegt werden, und die Verzeichnisse für die Templates und für den Cache angegeben werden. Der Code, der an die Templates übergeben werden soll, muss zuvor registriert werden:
$my_smarty->assign( 'name', $name ); $my_smarty->assign( 'first_name', $first_name );
Die SMARTY-Templates selbst sind einfache HTML-Dateien, die an den gewünschten Stellen die SMARTY-Variablen und ggfs. SMARTY-Steuerungscode (insbesondere Schleifenlogik) enthalten können:
Das folgende Beispiel demonstriert ein SMARTY-Template ohne Steuerungslogik. Die Standardlimiter für Smarty sind { und }. Es hat sich jedoch in der Praxis als empfehlenswert herausgestellt wie im oben aufgeführten PHP-Beispiel andere Bezeichner zu verwenden, da die geschweiften Klammern mit evtl. eingebettetem JavaScript kollidieren könnten.
<html> <body> Name: {.. $name ..} Vorname: {.. $first_name ..} </body> </html>
Kritik und Unterschied zu anderen Konzepten
Allgemeine Kritik
Unzureichende Trennung von Logik- und Präsentationsschicht
Von den Herstellern von Smarty wird behauptet, Smarty unterstütze die Trennung von Logik ("Programmcode") und Präsentation ("Design") innerhalb von Webapplikationen.
Die Forderung nach der Trennung von Logik und Präsentation ist eine der Grundforderungen der Programmiertechnik in Systemen, die mit dem Benutzer interagieren. Die Trennung soll die Wartbarkeit des Codes verbessern. Bereits 1979 wurde das MVC-Prinzip beschrieben, das eine solche Trennung ermöglicht. Dieses Prinzip hat sich seitdem für viele Anwendungsfälle durchgesetzt.
Smarty unterscheidet sich hierbei insofern, dass es keine Dreiteilung, sondern lediglich eine Zweiteilung explizit fordert: Eine - wie auch immer geartete - Logik gibt die Daten zur Darstellung meist bereits in der richtigen Form (Zeichenketten) an eine selbst eher "dumme" Präsentationsschicht, die ihrerseits auf die textuelle Ausgabe beschränkt ist.
Während nach dem MVC-Prinzip die Art der Darstellung noch grundsätzlich frei ist (Bildschirm, Audio, Druck oder alle anderen denkbaren Ausgabemedien), ist die Präsentationslogik bei Smarty auf den speziellen Fall der einfachen Textausgabe beschränkt.
Die Trennung von Logik und Präsentation ist in Smarty somit unzureichend gelöst und das Hauptargument, weshalb man Smarty nutzen soltle, somit hinfällig.
Diese Schlussfolgerung gilt allgemein für Template Engines: Sie wurden ursprünglich nie dazu erdacht, Code von Text zu trennen, sondern im Gegenteil wurden Template Engines geschaffen, um statischen Text und dynamische Anteile möglichst effizient mischen zu können.
Zusätzliche Komplexität durch eigene Sprachsyntax
Auffällig ist, dass der eigentliche Prozess zur Trennung von "Logik" und "Darstellung" auch ohne Smarty einfach gelöst werden kann und mit wenigen Zeilen Code zu erreichen ist, während Smartys Hauptentwicklungen auf der eigenen Sprachsyntax und den daraus erwachsenen Problemen beruhen.
Die Hauptprobleme dieser eigenen Syntax sind:
- Erhöhte Einarbeitungszeit ("Lernkurve") für den Entwickler
- Unzureichende Mächtigkeit: Es sind nur sehr eingeschränkte Operationen auf den vorliegenden Daten möglich; der Zugriff auf Objektstrukturen ist erheblich verkompliziert (s.u.)
- Die eigene Syntax erfordert im System neben einem Parser und Compiler eine erhebliche Logistik, um die Performance wieder auf ein erträgliches Maß zu erhöhen.
Aufgrund der unzureichenden Trennung von Präsentation und Logik wird von einigen professionellen Entwicklern die Frage gestellt, ob der Aufwand für die Einführung einer eigenen Template-Sprache, wie sie Smarty mitbringt und die nur einen speziellen Fall löst, im Verhältnis zum daraus gewonnenen Nutzen steht, zumal Smarty eben kein Ersatz für ein MVC-Pattern ist und PHP selbst eigentlich bereits als "Template-Sprache" entworfen wurde.
Es existieren für PHP zahlreiche Frameworks, die sich stärker an einem MVC-Pattern orientieren und ohne eigene Sprachsyntax auskommen [1].
Praktische Unzulänglichkeiten
- SMARTY bietet nur sehr unzureichende Möglichkeiten um auf Objektstrukturen zuzugreifen. So ist es z.B. nicht möglich ein Objekt zu registrieren, und dessen Eigenschaften und Unterobjekte rekursiv darzustellen. In diesem Fall müssen vorher entsprechende Array-Strukturen aufgebaut werden, auf die SMARTY dann iterativ zugreifen kann.
- Die aufgestellte Behauptung, die Entwicklungsgeschwindigkeit eines Projekts könnte mit Smarty gesteigert werden, ist durch nichts belegt. Die klassische Softwaretechnik bietet wesentlich mehr und ausgereiftere Möglichkeiten, eine sinnvolle Arbeitsteilung in Projekten zu verwirklichen.