Frameworks haben die Entwicklung großer Webanwendungen in den letzten Jahren geprägt. Zum Leidwesen der PHP-Entwickler meist auf anderen Plattformen. So existieren beispielsweise für Java bereits seit Jahren mächtige und ausgereifte Lösungen, welche die Implementierung vereinfachen und somit auch die Entwicklungszeit deutlich verkürzen. Seit die Objektorientierung mit dem Erscheinen der Version 5 in vollem Umfang Einzug in die Welt der PHP-Entwicklung gehalten hat, entstehen hier ebenfalls neue Frameworks beinahe im Wochenrhythmus.
Ein gutes Framework erleichtert die Arbeit des Entwicklers enorm, indem es ihm lästige und immer wiederkehrende Arbeiten abnimmt. Dazu stellt es gut aufeinander abgestimmte Klassen und Bibliotheken bereit, deren Funktionalität weit über das hinausgeht, was eine reguläre PHP-Installation bietet. Mit Symfony steht PHP-Entwicklern ein solches Framework zur Verfügung. Es ist ausgereift, leistungsfähig und bietet eine Unmenge an Helfern und Tools, die das Leben einfacher machen. Im Gegensatz zu vielen neuen und jungen Framework-Projekten kann Symfony aber bereits mit einer ausführlichen Dokumentation, vielen Beispielen und einer großen Nutzerbasis aufwarten, was den Einstieg einfacher gestaltet.
Model-View-Controller
Wie die meisten modernen Webframeworks arbeitet auch Symfony nach dem Model-View-Controller-Prinzip. Ziel dieses kurz MVC genannten Entwurfsmusters ist die strikte Trennung von Daten-, Anwendungs- und Anzeigelogik einer Anwendung. Alle Teile arbeiten weitgehend unabhängig voneinander und haben jeweils eine fest umrissene Aufgabe. Der Model-Part ist für das komplette Datenhandling und somit auch für die Zugriffe auf eine Datenbank verantwortlich. Für die Umsetzung der Daten in eine grafische Benutzeroberfläche ist der View zuständig.
Beide Anwendungsteile werden von einem Controller gesteuert. Er entscheidet, welche Daten des Models in welchem View angezeigt werden. Diese strikte Trennung hat den Vorteil, dass einzelne Programmteile einfacher ausgetauscht werden können. Sollen beispielsweise die Daten zukünftig nicht mehr in einer Datenbank, sondern in Dateien abgelegt werden, ist lediglich eine Änderung der Klassen im Model notwendig, die restlichen Applikationsteile sind nicht betroffen. Das MVC-Prinzip eignet sich somit hervorragend für den Einsatz in der Entwicklung grafischer Benutzeroberflächen.
Installation und Sandkasten
Symfony ist in verschiedenen Ausführungen auf der Projektseite [1] erhältlich. Neben der regulären Download-Version existiert noch eine so genannte Sandbox [2].
Diese enthält alles Notwendige, um sich einen schnellen Überblick über
Symfony zu verschaffen. Alle Komponenten sind bereits fix und fertig
vorkonfiguriert und ein leeres Projekt angelegt. Ein Entpacken der
Sandbox in ein Verzeichnis des Webservers ist alles, was zur
Installation notwendig ist.
Die Installation und Konfiguration der regulären Download-Version ist ein wenig aufwändiger und zeitintensiver – für Projekte, die über die ersten Schritte hinausgehen, aber der richtige Weg. Die Installation erfolgt über ein eigenes PEAR-Repository und läuft weitgehend automatisch ab. Lediglich die Konfiguration und Erstellung des Projekts mit dem Symfony-Generator erfordert etwas Arbeit. Grundvoraussetzung für eine erfolgreiche Symfony-Installation ist ein Server mit PHP 5 und eine korrekt arbeitende PEAR-Erweiterung. Die Tücken stecken allerdings im Detail. So gibt es mit der PHP-Version 5.1.2 des Öfteren Probleme, hier ist ein Update auf eine aktuellere Version angezeigt. Auch muss die PHP-Installation entsprechend konfiguriert werden. So müssen beispielsweise die Optionen „magic_quote_gpc“ und „register_globals“ in der php.ini auf „Off“ gestellt sein, damit das Framework seinen Dienst verrichtet. Bereits hieran lässt sich erkennen, dass sich Symfony auf einem Shared-Hosting-Server mitunter nur schwer in Betrieb nehmen lässt.
Gerüstbau und Rahmenwerk
Wie viele andere Frameworks orientiert sich auch Symfony an dem großen Vorbild Ruby on Rails (RoR). Einer der revolutionären Ansätze von RoR ist die Einführung eines zentralen Kommandozeilentools, das neben administrativen Aufgaben auch Quellcode erzeugen kann. Ähnlich wie RoR besitzt auch Symfony einen solchen Generator. Dieser ist somit Dreh- und Angelpunkt jeder Entwicklung mit Symfony und ungeheuer praktisch noch dazu. So können mit einzelnen Kommandos beispielsweise die Grundgerüste neuer Masken oder Datenbankzugriffsklassen erzeugt werden. Diese Art der Softwareentwicklung wird vielen zuerst sehr umständlich erscheinen, nach einer kurzen Eingewöhnungsphase möchte man dieses Tool aber nicht mehr missen.
Auch bei anderen Teilen von Symfony findet der Best-Practice-Ansatz Anwendung. So wird als Datenbankschnittstelle Propel [3] genutzt. Den meisten Webanwendungen liegt eine Datenbank zugrunde, in der alle zu verwaltenden Daten gespeichert werden. Der Einsatz von Propel für alle Datenbankzugriffe hat mehrere entscheidende Vorteile. So werden automatisch verschiedene Datenbanktypen unterstützt, ohne dass dazu der Quelltext umprogrammiert werden muss. Einige Änderungen an den Konfigurationsdateien genügen. Neben MySQL werden beispielsweise auch PostgreSQL, SQLite, Oracle und andere populäre Datenbankserver unterstützt. Neben der Datenbankabstraktion ist durch Propel auch ein objektorientierter Zugriff auf die relationalen Daten in der Datenbank möglich. Die Umsetzung von Objekten in relationale Daten erledigen die Propel-Klassen automatisch.
Damit jedoch nicht genug: Propel bietet ausgefeilte Klassen für nahezu alle Bereiche einer modernen Webanwendung. So darf neben Klassen zur Internationalisierung auch der Bereich Ajax nicht fehlen. Symfony ist hier sehr stark mit Scriptacolous bzw. Prototype verwoben und bietet dadurch bereits eine äußerst gute Basis zur Schaffung von Ajax-basierten Rich-Client-Anwendungen. Durch die Kapselung der Ajax-Funktionen in Symfony-Klassen und Helfer-Skripte lassen sich solche Anwendungen auch mit wenig Programmiererfahrung in JavaScript schnell und einfach bewältigen. Durch Plugins lässt sich Symfony auch um weitere Rich-Client-Frameworks wie Dojo oder YahooUI erweitern.
CRUD
CRUD ist ein Schlagwort, das im Zusammenhang mit Frameworks immer wieder fällt. CRUD steht für Create, Retrieve, Update und Delete. Diese vier Funktionen bilden in den meisten Fällen den Kern einer jeder Webanwendung. Gerade hier spielt Symfony eine seiner Stärken aus. Der Quelltext-Generator ist in der Lage, anhand einer Datenbankdefinition Masken für alle genannten Operationen zu generieren. Das Ausführen des folgenden Kommandos führt so zu einem kompletten Modul einer durch eine Datenbanktabelle definierten Klasse.
symfony propel-generate-crud frontend Task Task
Listing 1
Der Aufruf bewirkt die Erstellung aller notwendigen Controller-, View- und Modelklassen anhand der vorgegebenen Tabellenbeschreibung im Propel-XML-Schema. Das so erzeugte Modul ist bereits voll funktionsfähig, das heißt es unterstützt die vier genannten Operationen. Wer möchte, kann es selbstverständlich noch nach Belieben an eigene Bedürfnisse anpassen.
Layout mit fleißigen Helfern
Wie bereits eingangs erwähnt, werden bei der Entwicklung mit Symfony Inhalt und Gestaltung klar voneinander getrennt. Die View-Klassen sind für die Ausgabe der Daten als HTML-Seite verantwortlich und nutzen Templates zur Ausgabe. Dadurch lässt sich das Design einer Anwendung zu einem späteren Zeitpunkt sehr einfach verändern. Jede Seite kann dabei aus mehreren Templates bestehen. So lassen sich Elemente, die auf allen Seiten vorkommen, in einem einzigen Template zusammenfassen.
Damit der Quellcode der einzelnen Views übersichtlich und sauber bleibt, bietet Symfony eine Reihe so genannter Helfer-Skripte. Diese Skripte erzeugen teilweise sehr komplexen und aufwändigen HTML-Quellcode durch den Aufruf einer einzigen Funktion. Symfony bietet eine Menge solcher Skripte, die sich auch nach Belieben erweitern oder durch online verfügbare Bibliotheken ergänzen lassen. Standardmäßig sind Helfer für die Erzeugung von Formularen, Links, JavaScript-Quellcode oder Ajax-Konstrukten und vieles andere mehr enthalten. Das nachfolgende Beispiel zeigt den Einsatz zweier Helfer-Skripte zur Datumsformatierung und Linkerzeugung innerhalb eines Templates.
<?php use_helper('Date');?> Datum: <?php echo format_date($date, 'd', 'de');?><br/> <?php echo link_to('Task bearbeiten', 'Task/edit?id=1');?>
Listing 2
Fazit
Mit Symfony steht ein Framework für PHP zur Verfügung, das den Vergleich mit der Konkurrenz nicht scheuen muss. Die Entwicklung der Version 1.0 ist weitgehend abgeschlossen. Das Framework hat sich aber bereits seit langem im produktiven Einsatz bei unzähligen Projekten bewährt und kann bedenkenlos eingesetzt werden. Neben der Vielzahl an Funktionen und der durchdachten und performanten Struktur sind weitere Pluspunkte die große und hilfsbereite Community und die umfangreiche Dokumentation und Beispielsammlung, die online verfügbar ist.