Routing in Contao 4
für Entwickler
Einstieg in das Routing Konzept für Umsteiger von Contao 3
Glen Langer
Version: 1.0.0 vom 27.01.2018
Quellen
- Online Doku von Symfony / Quellcode Contao
- Erfahrung durch Ausprobieren
Lizenz
Dieses Werk ist lizenziert unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Deutschland Lizenz.
Über mich
- Contao seit 2.5.8
- PHP ZCE
- Forum: BugBuster
- http://contao.ninja/
- Arbeitgeber: T-Systems
Worum geht es?
- Wozu und warum Routing?
- Wie ist das Prinzip
- Welche Routing-Arten gibt es in Contao
- Was wird alles benötigt an Definitionen und Dateien
- Ein Beispiel als Bundle Sourcecode
- Hinweise für den Spezialfall: AppBundle
Wozu und warum Routing?
- saubere URLs (SEO)
- Eliminierung von eigenen Entry Points
- Wartung, Ansprache per Name im Template
Wie ist das Prinzip
Routing
- URLs werden anhand einer Konfiguration auf die richtigen PHP Klassen geleitet
-
URLs (Pfade) können dynamisch generiert werden über Name der Route
- Anpassung der Generation durch Konfiguration möglich, keine Anpassung z.B. im Template nötig
-
Beispiel: aus /blog soll /neues werden
Wie ist das Prinzip
Controller
-
wo Routing da auch Controller
-
Controller: PHP-Methoden (Actions) in einer Klasse (Action-Container)
-
Informationen aus dem Request-Objekt von Symfony
Wie ist das Prinzip
Aufbau der URL
-
statische Teile ( contao/install )
-
dynamische Teile möglich (Part in geschweiften Klammern)
blog_list /blog/{page}
blog_show /blog/{slug}
Beispiel-URLs: /blog/2, /blog/routing
Problem!
Problem
-
Wenn zwei Routen mit derselben URL übereinstimmen, gewinnt die erste geladene Route
Lösungsmöglichkeit 1
blog_list /blog/{page}, requirements={"page": "\d+"}
blog_show /blog/{slug}
Lösungsmöglichkeit 2
blog_list /blog/list/{page}
blog_show /blog/show/{slug}
Routing-Arten in Contao
Frontend
visitors_frontend_screencount /visitors/screencount
..."_scope" = "frontend"
contao_frontend /{alias}.html
contao_index /
contao_catch_all /{_url_fragment}
Routing-Arten in Contao
Backend
contao_backend /contao
contao_backend_login /contao/login
visitors_backend_details /visitors/details
..."_scope" = "backend"
"_token_check" = true
Routing-Arten in Contao
Backend Main
Entspricht der Contao 3 Variante Callback Modul statt Definition über DCA
backend_main /bemain/botstatistik
... "_scope" = "backend"
"_token_check" = true
"_custom_backend_view" = true
Benötigt EventListener, DependencyInjection, Twig Template, Hook Registrierung
Definitionen und Dateien
Annotations
-
Defintion der Routen über Annotations im PHPDoc Bereich des Controllers
-
Annotations bis Symfony <3.4 nicht von Symfony sondern als SensioFrameworkExtraBundle
-
Alternative ab Symfony 3.4 möglich: Componente nutzen
use Symfony\Component\Routing\Annotation\Route;
Annotations
@Route
- Bei Class Annotation als Route Prefix
- Angabe der Route, zusätzlich Default Werte möglich
- Annotation Namespace:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
Annotations
@Method
- GET/POST
- Annotation Namespace:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
Annotations
@Template
- Verbindet Controller mit Template Datei (Twig)
- Angabe BundleName : Unterverzeichnis (opt.) : Dateiname des Templates
- Annotation Namespace:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
Annotations
@ParamConverter
- Konverter um Parameter in Objekte zu konvertieren
- können dann als Attribute abgefragt werden
- Annotation Namespace:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
Annotations
@Cache
- Definiert HTTP-Caching-Header für Ablauf und Validierung
- Annotation Namespace:
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
Annotations
@Security
- beschränkt den Zugriff auf Controller
- nur in Symfony 2.4, ab 3.0 in Verbindung mit @IsGranted
Definitionen und Dateien
routing.yml
-
Hinweis auf die Annotations in Resources/config/routing.yml
-
Contao Manager Plugin wird angewiesen die routing.yml zu laden
Hinweise routing.yml
- keine Tabs in yml Dateien!
- Normal sind 2 oder 4 Leerzeichen stattdessen.
- neue Route im "prod" erst nach cache:clear und warmup verfügbar
Routen prüfen
Registrierte Routen anzeigen:
vendor/bin/contao-console debug:router
Route testen:
vendor/bin/contao-console route:match "/blog"
Beispiel: Bundle Sourcecode
Live auf GitHub
Links
Routing
Controller
Template
Annotations
Fragen?
Dann los!
Happy Coding!
Aktuelle Version dieser Folien auf: docs.contao.ninja
(auch als PDF und später auch als offizielles Video)