Artikel
von Patrick Froch
Wie man eine Seite inklusive Routen und Controllern erstellt, habe ich bereits im Artikel Symfony2: Seite anlegen beschrieben. Nun möchte ich das Konfigurieren von verschiedenen Routen mit und ohne Parametern und Vorgabewerten etwas eingehender betrachten.

Routen erstellen

Um eine Route anzulegen wird der Pfad und der aufzurufende Controller in die Datei app/config/routing.yml eingetragen. Wird nun ein Path mit dem Muster /blog/* aufgerugen (z.B. /blog/symfony2 oder /blog/test), so wird die Methode showAction des Controllers Acme\BlogBundle\Controller\BlogController aufgerufen und der Wert nach /blog/ als Parameter übergeben (z.B. symfony2 oder test).

Die Sache mit den Namen in Symfony kann am Anfang etwas verwirrend sein. Der Controller wurde mit dem logischen Namen (AcmeBlogBundle:Blog:show) angegeben. Dieser setzt sich aus dem Namespace (Acme\BlogBundle\Controller) ohne \Controller, dem Namen der Klasse (BlogController) ohne das Wort Controller und den Namen der Methode (showAction) ohne das Word Action zusammen. Wem dies zu kompliziert ist, der kann auch den kompletten Namen verwenden.

Außer app/config/routing.yml gibt es noch weitere Orte, an denen Routen konfiguriert werden können. Weiter unten wird noch darauf eingegangen.

Eine einfache Route

Eine Route besteht mindestens aus drei Teilen: dem Namen, dem Pfad und dem Namen des Controllers, der aufgerufen werden soll, wenn die Route zum Request passt. In diesem Beispiel ist der Name der Route _welcome, der Pfad ist / und der Controller ist AcmeDemoBundle:Main:homepage.

Routen mit Platzhaltern

Da man nicht immer nur statische Seiten ausgeben möchte, kommt schnell der Wunsch auf, Routen mit Platzhaltern zu erstellen. Auch dies ist ganz einfach: Diese Route trägt den Namen blog_show, der Pfad lautet /blog/{slug} und der Controller AcmeBlogBundle:Blog:show. Zu Beachten ist das {slug} im Pfad, dies ist eine Variable. Im Controller kann man mit $slug auf den Inhalt zugreifen.
Update 28.06.2015: Will man eine zweite Route erstellen, muss dieser einen eigenen Namen erhalten (s. Routen mit Festlegung der HTTP-Methode). Dies kann leicht übersehen werden.

Routen mit Vorgabewerten

Will man nun einen Vorgabewert für eine Variable definieren, wird dies einfach beim Controller mit angegeben: Hier wird die Variable {page} verwendet und mit page: 1 ein Vorgabewert eingestellt. Wird also kein Wert übergeben, hat $page im Controller den Wert 1. Wird ein Wert übergeben (z.B. 2), so hat $page den entsprechenden Wert.
Routen mit optionalen Parametern am Ende treffen nicht auf Pfade mit Slah (/) am Ende zu. Dass heißt, /blog passt zur Route, /blog/ nicht!

Routen mit zusätzlichen Anforderungen

Es können weitere Anforderungen definiert werden, welche ein Parameter erfüllen muss, damit die Route zutrifft: Im Abschnitt requirements wird mit page: \d+ festgelegt, dass nur Zahlen übergeben werden dürfen. Wird ein Text übergeben, greift die Route nicht. Soll eine Liste mit möglichen Werten angegeben und ein Vorgabewert festgelegt werden, kann dies so aussehen: Der Parameter {culture} muss en oder fr sein, wird kein Wert übergeben, so ist {culture} en. Wird z.B. de übergeben, passt diese Route nicht.

Routen mit Festlegung der HTTP-Methode

In Symfony kann man für jede HTTP-Methode eine eigene Route definieren. Mit methods: [GET] und methods: [POST] wird hier festgelegt, dass jeweils ein anderer Controller aufgerufen werden soll.

Ein aufwendigeres Beispiel

In dem folgenden Beispiel kommen die beschriebenen Elemente zusammen.

Einbinden weiterer Ressourcen

Damit man nicht eine riesige Datei mit allen Routen einer Anwendung erstellen muss, gibt es die Möglichkeit, die Konfiguration der Routen in die Bundles auszulagern und in die zentrale Routing-Datei einzubinden. Die Datei @AcmeHelloBundle/Resources/config/routing.yml sieht dann genauso aus, wie die normale Routing-Datei. Auf weitere Möglichkeiten die Routenkonfiguration auszulagern gehe ich in weiteren Artikeln ein.

Zurück

Kommentare

Aufgrund der unklaren Rechtslage durch die DSGV habe ich mich entschlossen, die Kommentare bis auf Weiteres zu deaktivieren.