PHP-Framework Symfony
Web-Entwicklung mit Symfony

DeveloperIT-ProjekteSoftware

Frameworks bieten einen effizienten Weg, Web-Anwendungen zu entwickeln, und sind aus der PHP-Welt nicht mehr wegzudenken. Dieser Workshop liefert einen Einstieg in das PHP-Framwork Symfony.

In Arbeit: Version 1.0

PHP-Framework Symfony

Symfony ist ein Framework zur Erstellung von Web-Anwendungen. Wie bei jedem anderen Framework ist die Zielsetzung, dem Entwickler so viel lästige Arbeit wie möglich abzunehmen und ihm die Möglichkeit zu geben, sich auf das Wesentliche zu konzentrieren. Dazu stellt das Framework aufeinander abgestimmte Klassen und Mechanismen bereit, die weit über das hinausgehen, was eine reguläre PHP-Installation zur Verfügung stellt. Auch vereinfacht die Verwendung eines Frameworks die Wartung einer Anwendung und verkürzt die Entwicklungszeit erheblich.

Das Symfony-Framework existiert bereits seit Längerem. Aus diesem Grund ist der Funktionsumfang mittlerweile gewaltig. So enthält das Framework unter anderem Klassen zur Internationalisierung, Caching, Formularvalidierung, Ajax-Interaktion, E-Mail-Verarbeitung, für Warenkorb-Funktionen und Paging. Viele der für Unternehmensanwendungen nötigen Funktionen liefert Symfony bereits von Haus aus mit. Die Software liegt im Moment als Version 0.6.3 vor, der aktuelle Entwicklungszweig nähert sich allerdings bereits der Freigabe als Version 1.0.


Model-View-Controller

PHP-Framework Symfony

Wie die meisten Frameworks für Web-Anwendungen arbeitet auch Symfony nach dem Model-View-Controller-Prinzip. MVC ist ein so genanntes Entwurfsmuster (englisch: Design Pattern) und ist bei der Erstellung grafischer Anwendungen sehr beliebt. Der Clou des Ganzen liegt in der strikten Trennung zwischen Daten-, Anwendungs- und Anzeigelogik eines Programms. Der Model-Teil einer Anwendung übernimmt die Datenhaltung, also die Verwaltung und die Zugriffe auf die Anwendungsdaten in Dateien oder Datenbanken. Die View-Komponente ist für die Aufbereitung und Anzeige der Daten zuständig. Der Controller entscheidet, welche View und welches Model bei welchem Vorgang zum Einsatz kommen. Dadurch ergibt sich folgende Aufgabenteilung:

– Model: Datenlogik
– View: Anzeigelogik
– Controller: Steuerungslogik


Sandkasten

PHP-Framework Symfony

Die Trennung der einzelnen Applikationsteile in diese drei Komponenten hat ihre Vorteile. So kann beispielsweise eine Model-Klasse von unterschiedlichen Anzeige-Klassen verwendet werden.

Die Symfony-Community bietet eine so genannte Sandbox an. Diese Umgebung liefert bereits alles mit, was zum Testen von Symfony notwendig ist. Alle erforderlichen Komponenten sind bereits vorinstalliert und konfiguriert. Zudem ist bereits ein leeres Projekt angelegt. Die Sandbox-Datei kann unter www.symfony-project.com/get/sf_sandbox.tgz heruntergeladen werden. Anschließend entpacken Sie das Archiv lediglich in ein Unterverzeichnis des Webservers. Der Aufruf dieses Unterverzeichnisses im Browser (beispielsweise http://localhost/sandbox/ web) öffnet eine Willkommensseite von Symfony. Da keine weiteren Konfigurationen mehr vorgenommen werden müssen, steht eine ideale Umgebung zum Testen von Symfony zur Verfügung.


Gerüstbau

PHP-Framework Symfony

Viele Aufgaben bei der Entwicklung großer Anwendungen sind immer wieder ähnlich. Eine der Stärken von Symfony ist daher der Generator, der je nach Bedarf Quellcode automatisch für einzelne Teile der Anwendung erzeugt. Dieses Vorgehen wird bei Symfony und anderen Frameworks auch Scaffolding genannt. Während sich die normale Web-Entwicklung fast ausschließlich innerhalb eines Editors oder einer Entwicklungsumgebung abspielt, kommt bei der Erstellung einer Symfony-Anwendung des Öfteren die Kommandozeile zum Einsatz.

Das Konsolenkommando ist dabei nicht nur für die Erstellung von Programm- oder Klassengerüsten zuständig. Es wird auch genutzt, um Caches zu löschen oder die Propel-Datenbankschicht zu verwalten. Die Symfony-Konsolenanwendung ist daher ein zentraler Punkt für die Erstellung von Anwendungen mit dem Framework. Wie im weiteren Verlauf noch zu sehen sein wird, erleichtert diese für die meisten noch ungewöhnliche Arbeitsweise den Entwickleralltag enorm.


Datenbasis

PHP-Framework Symfony

Den meisten Web-Anwendungen liegt eine Datenbank zu Grunde, in der alle zu verwaltenden Daten gespeichert sind. Die ORM-Software Propel ist ein fester Bestandteil von Symfony. ORM steht für Objekt-relationales Mapping und ist in anderen objektorientierten Sprachen schon seit längerer Zeit eine gängige Technik, um auf Datenbanken zuzugreifen. Auch für PHP erlangt diese Art von Datenbankzugriff eine immer größere Bedeutung. Der Grund ist einfach: In objektorientiert programmierten Anwendungen liegen alle Daten in Form von Objekten vor. Diese Art der Datenhaltung passt nicht sonderlich gut mit der relationalen Datenhaltung in Datenbanken wie MySQL, PostgreSQL oder anderen populären Webdatenbanken zusammen. Für PHP-Entwickler bedeutet dieser Umstand in der Regel das manuelle Zusammensetzen von SQL-Statements aus Objektdaten. Dieses Vorgehen ist langwierig und fehleranfällig. Propel nimmt den Entwicklern diese lästige Arbeit ab, indem es für das Speichern der Daten eine objektorientierte Schnittstelle schafft.

Entwickler von Anwendungen kommen durch den Einsatz von Propel zudem in den Genuss eines weiteren Features. Propel basiert auf Creole, einem Datenbankabstraktions-Layer. Dadurch genügt eine Änderung der Konfiguration, damit eine Anwendung auf verschiedenen Datenbanken lauffähig ist. Neben MySQL werden auch SQLite, PostgreSQL, Oracle und MS SQL unterstützt. Durch den für die Zukunft geplanten Umstieg auf PDO als Datenbank-Layer von Propel werden noch weitere Datenbanken folgen.


Datenbankzugriff

PHP-Framework Symfony

Die Erzeugung der Propel-Klassen gelingt über die Symfony-Konsolenanwendung. Grundvoraussetzung ist lediglich eine Konfigurationsdatei, die die Definition der Datenbankstruktur enthält. Das folgende Listing zeigt einen Ausschnitt eines solchen Datenbankschemas.


propel:
project_task:
_attributes: { phpName: Post }
id:
title: varchar(255)
description: longvarchar
priority: integer
created_at:

Für die weiteren Schritte speichern Sie dieses Datenbankschema unter dem Namen schema.yml im config-Verzeichnis der Symfony-Anwendung. Das Listing zeigt die Definition einer einzelnen Tabelle. In einer realen Web-Anwendung umfasst diese Datei selbstverständlich mehrere Tabellen. Um nun aus der Schema-Definition die Datenbank und die erforderlichen Zugriffsklassen zu erstellen, sind lediglich die folgenden drei Schritte auf der Kommandozeile notwendig:


> symfony propel-build-model
> symfony propel-build-sql
> symfony propel-insert-sql

Das war?s! Der erste Befehl erzeugt aus dem Schema die Klassen, über die auf die Datenbank zugegriffen wird. Diese werden in das Verzeichnis lib/model gespeichert. Mit den beiden darauf folgenden Befehlen wird eine Datei mit SQL-Befehlen erstellt und diese direkt auf die Datenbank angewendet. Das Resultat aus einer kurzen Konfigurationsdatei und ein paar Befehlen ist eine funktionsfähige Datenbank und eine zugehörige objektorientierte Schnittstelle.


Crud

PHP-Framework Symfony

Crud ist ein Schlagwort, das im Zusammenhang mit Web-Frameworks immer wieder fällt. Dieses seltsame Wort ist eine Abkürzung für Create, Retrieve, Update und Delete und spiegelt damit die Funktionen einer normalen Web-Anwendung wieder. Auch hier spielt Symfony wieder die Stärken seines Quellcode-Generators aus. Der Aufruf eines Befehls auf der Kommandozeile genügt, um anhand des Datenbankschemas eine funktionsfähige Anwendung zu erzeugen.

> symfony propel-generate-crud frontend task Task

Das Framework erzeugt mit diesem Befehl eine Reihe von Masken und Dateien, die notwendig sind, um die vier vorgestellten Basisfunktionen einer Anwendung auszuführen. Die so generierte Anwendung kann mit einem Aufruf des URLs http://localhost/sandbox/web/index.php angezeigt und verwendet werden.


Layout mit Templates

PHP-Framework Symfony

Selbstverständlich ist die so erzeugte Anwendung noch nicht in einem Zustand, mit dem man Endbenutzer konfrontieren möchte. Die von Symfony automatisch erzeugten Masken sind zwar funktional, aber optisch nicht gerade ein Leckerbissen. Der Aufruf des Symfony-Kommandos zur Erzeugung der Oberflächen hat zur Folge, dass auch für jede Maske ein Template-File angelegt wird.

Diese Masken befinden sich im Verzeichnis apps/frontend/modules. Für jedes Modul wird hier ein Verzeichnis angelegt. Das Modul entspricht im Fall des oben erzeugten Beispiels der Tabelle task. In diesem Verzeichnis sind alle Templates gespeichert, getrennt nach verschiedenen Aktionen. Standardmäßig sind hier Vorlagen für die Aktionen list, edit und show vorhanden, die getrennt bearbeitet werden können.

Eine solche Vorlage enthält keine komplette HTML-Seite, sondern nur den Quellcode-Aussschnitt, der für diese Aktion notwendig ist. Das Template für die show-Aktion enthält somit eine Definition der Tabelle, die zur Anzeige aller Datensätze verwendet wird. Soll dieser Bereich optisch oder funktional verändert werden, so passen Sie einfach die Datei showSuccess.php an. Da die einzelnen Templates nur Teilausschnitte einer HTML-Seite enthalten, muss es auch irgendwo eine Datei geben, in der festgelegt ist, wie das ganze Drumherum aussieht. Tatsächlich befindet sich diese Datei im Verzeichnis apps/templates und nennt sich layout.php. Im dort enthaltenen Quelltext finden sich dann auch die für HTML notwendigen Tags wie und wieder. Das folgende Listing zeigt einen Ausschnitt aus der layout.php des Sandbox-Beispiels.



getRaw('sf_content') ?>


Durch den Aufruf der Funktion getRaw wird der HTML-Quellcode eingebunden, der je nach Modul und Aktion durch ein anderes Template erzeugt wird. Soll also die Seite um generelle Elemente wie ein Menü, eine Head-Leiste oder eine Fußzeile erweitert werden, so kann dies ganz einfach über die Datei layout.php erfolgen. Die Änderungen werden automatisch für alle anderen Templates wirksam. Da Symfony einen eingebauten Caching-Mechanismus enthält, ist es notwendig, den Cache nach Änderungen an Konfigurationen und Templates zu leeren. Dies geschieht mit folgendem Befehl auf der Kommandozeile:


> symfony clear-cache


Fleißige Helferlein

PHP-Framework Symfony

Damit der Quellcode der einzelnen Views einfach und sauber bleibt, bietet Symfony eine Reihe von Helfer-Skripts an. Diese Helper übernehmen die Aufbereitung von komplexeren HTML-Konstrukten. Das bedeutet, sie generieren HTML-Quellcode. Symfony bietet eine sehr große Menge an Hilfsfunktionen. Manche sind möglicherweise eher exotischer Natur, andere aber sehr hilfreich. So existieren Helfer für die Generierung von Formularen, Links, Javascript-Quellcode, Ajax-Funktionen, Internationalisierung und vieles andere mehr. Die Helper-Funktionen können direkt aus einem Template heraus aufgerufen werden. Das nachfolgende Listing zeigt die Verwendung zweier Helper zur Erzeugung eines Links und zur Ausgabe eines formatierten Datum-Strings:



Datum:


Ein Blick in die Dokumentation von Symfony lohnt sich allemal, um sich einen Überblick über die verfügbaren Hilfsfunktionen zu verschaffen.


Fazit

PHP-Framework Symfony

Mit Symfony steht ein Framework zur Verfügung, das sehr viele Funktionen enthält und dank vieler Helferskripts trotzdem einfach und sehr effektiv angewendet werden kann. Durch die Integration moderner Techniken und den Einsatz ausgereifter Bibliotheken wie Creole, Propel oder Spyc ist Symfony bereits in der aktuellen Version 0.6 stabil und kann auch für größere Projekte bedenkenlos eingesetzt werden.

In diesem Artikel wird nur an der Oberfläche von Symfony gekratzt. Auf der Projektseite stehen empfehlenswerte Tutorials und eine ausführliche Dokumentation zur Verfügung, die es Ihnen erlauben, tiefer in die Materie einzusteigen.