Anzeige
Anzeige
Software & Entwicklung
Artikel merken

Einblicke in Version 1.2: Symfonys neueste Komposition

Die letzten Monate des Jahres 2008 standen für die Symfony-Community ganz im Zeichen der neuen Version 1.2, welche am 1. Dezember das Licht der Welt erblickte. Großen Wert legte das Core-Team für dieses Release auf die Unabhängigkeit von den mitgelieferten Bibliotheken. Mit Doctrine ist ein zweiter Datenbank-Mapper neben Propel getreten. Außerdem erweitert das Core-Team den internen Einsatz des Forms-Frameworks und hat damit den Admin Generator komplett neu geschrieben.

6 Min. Lesezeit
Anzeige
Anzeige

Für den direkten Einstieg in die neueste Version von Symfony empfiehlt sich die Installation der Sandbox [1] anhand der Dokumentation [2]. Um die Codebeispiele des Artikels ausprobieren zu können, sollte man außerdem noch ein Datenbank-Schema in der Datei „config/doctrine/schema.yml“ anlegen.

Die Auswahl macht’s

Anzeige
Anzeige

In Sachen Datenbankabstraktion ist Symfony den nächsten Schritt gegangen und lässt dem Entwickler die freie Entscheidung zwischen den Mappern Propel und Doctrine, ohne dabei auf eines der Features von Symfony verzichten zu müssen. Das heißt alle Funktionen, wie der Admin-Generator, das Symfony Command Line Interface (CLI) oder die neuen datenbankgestützten Routen funktionieren mit beiden absolut gleichwertig. Das Aktivieren des gewünschten Mappers gestaltet sich denkbar einfach durch zwei Zeilen Code in der Datei „config/ProjectConfiguration.class.php“:

PHP
$this->enablePlugins(array('sfDoctrinePlugin'));
$this->disablePlugins(array('sfPropelPlugin'));

Listing 1

Nach dem Leeren des Symfony-Caches durch das Symfony CLI ist nun Doctrine als Mapper aktiviert und kann benutzt werden.

Anzeige
Anzeige

Sprichst du DQL?

Wie Propel bietet auch Doctrine die Möglichkeit, Anfragen an die Datenbank zu stellen, ohne dabei eine Zeile SQL-Code schreiben zu müssen. Doctrine verwendet hierzu die Doctrine Query Language (DQL), die eine vom verwendeten Datenbanksystem unabhängige, objektorientierte Schnittstelle zu SQL darstellt. Eine Abfrage nach allen Artikeln eines Blogs würde in DQL so aussehen:

Anzeige
Anzeige
PHP
$query = Doctrine::getTable('Article')->createQuery('a');
$articles = $query->fetchArray();

Listing 2

Doctrine führt den erstellten Query aus und legt das Ergebnis der Abfrage in einem assoziativen Array ab. Das Ergebnis der Abfrage kann dann zum Beispiel mit einer foreach-Schleife durchlaufen werden, die Spalten der abgefragten Tabelle lassen sich hierbei als Index ansprechen. Möchte man etwa den Titel des ersten Artikels anzeigen, reicht folgende Zeile Code völlig aus:

PHP
echo $articles[0]['title'];

Listing 3

Die volle Stärke von DQL zeigt sich allerdings erst, wenn Beziehungen zwischen den Tabellen ins Spiel kommen. Um zum Beispiel den Artikel mit der ID 1 und seine Kommentare anzuzeigen, würde das DQL Statement so aussehen:

Anzeige
Anzeige
PHP
$query = Doctrine_Query::create()
	    ->from('Article a')
	    ->leftJoin('a.Comments c')
	    ->where('a.id = ?', 1);
$article = $query->fetchOne();

Listing 4

Das Ergebnis kann wieder auf dieselbe Weise ausgelesen werden. Das Array „Index Comments“ enthält alle zum Artikel gehörenden Kommentare und kann auch als Array durchlaufen werden:

PHP
foreach ($article['Comments'] as $comment) {
	    echo $comment['body'];
}

Listing 5

Viele Routen führen nach Rom

Um URLs in der Form „http://example.com/artikel/1“ aufzulösen, verwendet Symfony ein eigenes Routing-System. Dieses wurde für das aktuelle Release komplett umgeschrieben, ist nun vollkommen objektorientiert und unterstützt die REST-Architektur. In älteren Versionen diente das System als eine Art statische Vermittlungsstelle zwischen Request und Controller. Da jede Route nun ein Objekt ist, können in den enthaltenen Actions oft wiederkehrende Aufgaben untergebracht werden.

Um etwa eine RESTful-API zur Verfügung zu stellen, können Routen der Klasse „sfRequestRoute“ die grundlegende Logik für REST-Anfragen erledigen. Die URL „example.com/article/1“ liefert zum Beispiel über eine HTTP-GET-Anfrage die Ressource mit der angegebenen ID zurück. Normalerweise würde ein Entwickler in der dazugehörigen Action jedesmal prüfen, ob die Request-Methode auch wirklich GET ist. Dies übernimmt in der neuen Version die folgende Einstellung in der Datei „routing.yml“:

Anzeige
Anzeige
YAML
article:
	  url:                   /article/:id
	  param:             { module: article, action: show }
	  requirements:  { sf_method: get }
	  class:               sfRequestRoute

Listing 6

Versucht der User nun, mit einer anderen Request-Methode als HTTP-GET die URL aufzurufen, wird er automatisch auf eine 404-Fehlerseite weitergeleitet.

Es lassen sich aber noch weitere Aufgaben in die Routen auslagern. Datenbankabfragen sind eine Sache, die in fast jeder Aktion zusammen mit Prüfungen auf Request-Parameter vorkommt. Um diese Aufgaben zu vereinfachen, gibt es nun die Routing-Klassen „sfPropelRoute“ und „sfDoctrineRoute“, mit denen Datenbankabfragen in der Route selbst ausgeführt werden können. Um zu der zuvor genannten URL immer eine Datenbankabfrage nach dem Artikel mit der übergebenen ID durchzuführen, reicht folgende Einstellung in der routing.yml:

YAML
article:
	  url:           /article/:id
	  param:    { module: article, action: show }
	  class:      sfDoctrineRoute
	  options:  { model: Article, type: object }

Listing 7

Diese Konfiguration der Route bewirkt die Durchsuchung der Tabelle „article“ nach dem Datensatz, der den Request Parameter „id“ als Primary Key enthält. Findet die Route den Datensatz nicht, erfolgt eine Weiterleitung auf die 404-Seite. Um den Datensatz in der entsprechenden Action zu erhalten, muss in ihr noch folgende Zeile Code eingefügt werden:

Anzeige
Anzeige
PHP
$this->article = $this->getRoute()->getObject();

Listing 8

Dadurch reduziert sich der Code in den meisten Aktionen auf eine Zeile. Allerdings ist dabei die REST-Architektur verloren gegangen. Außerdem müsste man mit vielen Routen in der routing.yml eine REST-Architektur zusammenbauen. Genau diese Problematik gehen die Collection-Routing-Klassen an – es gibt sie einmal ohne und mit Datenbankunterstützung. Collection-Routen definieren ein Bündel aus Routen für eine Ressource im Sinne von REST. Würde man also wieder das Artikel-Beispiel bemühen, könnte eine datenbankgestützte Collection-Route folgende Konfiguration in der routing.yml verwenden:

YAML
articles:
	  class:   sfDoctrineRouteCollection
	  options: { model: Article, module: article }

Listing 9

Als Ergebnis erhält man eine Kombination aus beiden zuvor genannten Varianten, was bedeutet, dass Routen die typischen Aktionen einer REST-Ressource erhalten (list, new, create, update usw.) und diese gleichzeitig schon die Datenbankabfragen erledigen. Dadurch wird der Code sowohl in den Aktionen als auch in der routing.yml noch weiter verringert und man kann sofort mit der Entwicklung von individuellen Features der zu entwickelnden Applikation beginnen.

Alle Macht dem Admin!

Das Wiedererfinden des Rads ist eine Disziplin, in der sich Entwickler immer wieder als sehr gut erweisen. Backends für den späteren Benutzer machen da keine Ausnahme. Da sich die Aufgaben für Backends meistens auf die Aktionen „erstellen, verändern, anzeigen und löschen“ minimieren lassen, haben die Symfony-Entwickler den Admin-Generator erstellt. Möchte man beispielsweise ein Backend für seine Artikel erstellen, genügen folgende CLI-Befehle:

Anzeige
Anzeige
CLI
./symfony generate:app backend
./symfony doctrine:generate-admin backend Article
./symfony cache:clear

Listing 10

Der ausgeführte Befehl legt ein Modul mit dem Namen „article“ in der Applikation „backend“ an, welches durch http://example.com/backend.php/article aufgerufen werden kann. Dies liefert ein bereits vollständig funktionierendes Admin-Interface für die article-Tabelle der Datenbank. Das erstellte Modul kann weiter konfiguriert werden, um es an die eigenen Bedürfnisse anzupassen. Reicht die generierte Funktionalität nicht aus, können die bestehenden Funktionen überschrieben und erweitert werden. Hierbei legt Symfony den generierten Code in seinem internen Cache ab und lässt die generierten Dateien dabei völlig unberührt. Dadurch kann der Entwickler die Dateien und Methoden anpassen, ohne sich Gedanken darüber machen zu müssen, dass sein Code irgendwann durch Symfony überschrieben werden könnte.

All diese Funktionalitäten weist das Framework bereits seit Version 1.0 auf. Neu hinzugekommen ist, dass der Admin-Generator auch mit Doctrine funktioniert, auf das Forms Framework aufsetzt und das neue Routing-System verwendet, wodurch die Konfiguration und Anpassung an die eigenen Bedürfnisse nochmals vereinfacht wurden.

Do you Jobeet?!

Kurz nach der Veröffentlichung des Release legte das Core-Team zusammen mit Community-Mitgliedern noch einen drauf und veröffentlichte das Jobeet-Tutorial [3], das in 24 Lektionen einen kompletten Rundgang durch das Framework bietet. Das Tutorial steht als Ausführung für Propel oder Doctrine bereit. Jedem, der tiefer in die Materie einsteigen möchte, sei das Tutorial wärmstens empfohlen. Und wer lieber mit Büchern arbeitet, kann seit neuestem das Tutorial auch in gedruckter Version käuflich [4] erwerben.

Mehr zu diesem Thema
Fast fertig!

Bitte klicke auf den Link in der Bestätigungsmail, um deine Anmeldung abzuschließen.

Du willst noch weitere Infos zum Newsletter? Jetzt mehr erfahren

Anzeige
Anzeige
Schreib den ersten Kommentar!
Bitte beachte unsere Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

Melde dich mit deinem t3n Account an oder fülle die unteren Felder aus.

Bitte schalte deinen Adblocker für t3n.de aus!
Hallo und herzlich willkommen bei t3n!

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team von mehr als 75 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Schon jetzt und im Namen der gesamten t3n-Crew: vielen Dank für deine Unterstützung! 🙌

Deine t3n-Crew

Anleitung zur Deaktivierung
Artikel merken

Bitte melde dich an, um diesen Artikel in deiner persönlichen Merkliste auf t3n zu speichern.

Jetzt registrieren und merken

Du hast schon einen t3n-Account? Hier anmelden

oder
Auf Mastodon teilen

Gib die URL deiner Mastodon-Instanz ein, um den Artikel zu teilen.

Anzeige
Anzeige