Artikel
von Patrick Froch

Contao 4: Eigene Route erstellen

In diesem Artikel zeige ich, wie man eine eigene Route für Contao 4 erstellt. Ich werde nicht auf alle Möglichkeiten des Routings eingehen können, aber es sollen die Grundzüge erläutert werden. Wollte man unter Contao 2 oder 3 einen eigenen "Entry point" für den Zugriff von außen (z.B. für eine API), hat man einfach in seiner Erweiterung eine entsprechende Datei erstellt und dort losgelegt. Dies war genau so einfach, wie gefährlich. Symfony bietet hier mit den Routen eine wesentlich ausgereiftere Lösung.

Im Folgenden wollen wir eine einfache Route erstellen, die uns den Pfad zur Uuid einer Datei zurück gibt. Auf Sicherheitsprüfungen wird weitgehend verzichtet, da diese beim Laden der Datei sowieso noch berücksichtigt werden müssen. Der vorgestellte Code sollte also auf gar keinen Fall so verwendet werden!

Hinweis: Ich gehe auf die Grundlagen der Bundels nicht mehr ein, da diese hier im Blog schon zur Genüge erläutert wurden.

ManagerPlugin

Wie immer haben wir zwei ContaoManagerPlugins, eins für die Entwicklungsumgebung und eins, dass später mit dem Bundle ausgeliefert wird und dafür sorgt, dass unsere Dateien nach der Installation von Contao geladen werden können.

Das Plugin für die Entwicklungsumgebung liegt unter app/ContaoManagerPlugin.php:

Das Plugin des Bundles liegt im Ordner des Bundles unter src/Esit/Demo/Classes/Contao/Manger/Plugin.php:

Neu bei den Plugins ist die Methode getRouteCollection, die die Routingkonfiguration lädt. Damit dies funktioniert muss die Klasse das RoutingPluginInterface implementieren! (s. Zeile 13!)

routing.yml

Nun müssen wir noch die Datei erstellen, die wir im Plugin laden wollen. Die Routingkonfiguration steht in der Datei src/Esit/Demo/Resources/config/routing.yml:

In Zeile 2 legen wir den Pfad der Url fest, auf den unser Controller reagieren soll. In Zeile 4 steht unsere Klasse und die Methode, die als Controller aufgerufen werden soll. In Zeile 8 legen wir noch fest, dass der übergebene Parameter 32 Stellen haben muss und aus den Zeichen a-f, A-F und 0-9 bestehen darf, also die hexadezimale Darstellung einer Uuid.

Service

Nun erstellen wir für unseren Controller einen Serviceeintrag in der Datei src/Esit/Demo/Resources/config/services.yml:

Im Gegensatz zu den "normalen" Services geben wir hier keine Klasse an, benutzen aber den Namespace und Klassennamen als Schlüssel für den Service (s. Zeile 2). Wir legen die Konstruktorparameter fest, die wir benötigen und setzen den Tag controller.service_arguments, um den Service als Controller zu definieren. Die Datei src/Esit/Demo/Resources/config/services.yml wird wie immer über die Extension-Datei des Bundels geladen (src/Esit/Demo/DependencyInjection/EsitDemoExtension.php).

Controller

Als letztes benötigen wir noch einen Controller, der die Arbeit für uns verrichtet und für uns das gewünschte Ergebnis erzeugt. Der Controller liegt unter src/Esit/Demo/Classes/Controller/UuidController.php:

In Zeile 21 werden die Konstruktorparameter entgegengenommen. Die eigentliche Arbeit macht die Methode loadAction ab Zeile 28. Sie erhält eine Uuid, lädt über das FilesModel die Daten der Datei aus der DB und gibt ein JSON-Objekt mit dem Pfad zurück.

Das war schon die ganze Magie. Selbstverständlich ist das Routing wesentlich leistungsfähiger, aber als Einstieg soll dies reichen.

Zurück

Kommentare

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