2.8 KiB
Routing & Navigations-Logik (KernelControllerListener)
Die Klasse src/AppBundle/Listener/KernelControllerListener.php implementiert die zentrale Routing-Logik für das CMS. Sie greift ein, wenn der Symfony-Router den Request an AppBundle\Controller\DefaultController::defaultAction leitet.
Funktionsweise
Der Listener analysiert den Request-Pfad (pathInfo) und entscheidet, welcher Controller tatsächlich ausgeführt werden soll.
1. API-Lookup (Priorität 1)
Zuerst wird geprüft, ob der Pfad über einen externen API-Call (Util::loadFromApi('cms/search', ...)) aufgelöst werden kann.
- Ziel-Controller:
AppBundle:Cms:iqTravelGuide - Template:
TravelGuide
2. Datenbank-Suche (Page Entity)
Wenn die API nichts zurückgibt, wird in der lokalen Datenbank (AppBundle:Page) gesucht.
- Methode A (Direkt): Suche nach Übereinstimmung im Feld
realUrlPath. - Methode B (Tree-Traversierung): Der Pfad wird anhand der Slashes (
/) zerlegt. Es wird versucht, den Pfad hierarchisch überslugund die Eltern-Kind-Beziehung (parent) aufzulösen. Die anfällige Nested-Set-Logik (lft/rgt,lvl) wird hier bewusst umgangen, um 404-Fehler bei inkonsistenten Trees zu vermeiden.
3. Redirects
- Hardcoded: Es gibt eine Liste fester 301-Weiterleitungen (z.B. alte Reiseführer-URLs).
- Datenbank: Tabelle
AppBundle:Redirect. Wenn keine Page gefunden wird, wird hier geprüft.
4. Controller-Zuweisung
Sobald eine Page-Entität ($node) gefunden wurde, wird der Controller basierend auf dem Inhaltstyp bestimmt:
| Inhaltstyp | URL-Suffix | Controller | Action |
|---|---|---|---|
| TravelProgram | /buchen, /berechne... |
AppBundle:Booking |
index |
| TravelProgram | /pdf |
AppBundle:Cms |
pdf |
| TravelProgram | (keins) | AppBundle:Cms |
travelProgram |
| FewoLodging | /buchen |
AppBundle:FewoBooking |
index |
| FewoLodging | (keins) | AppBundle:Cms |
fewoLodging |
| Standard Page | (keins) | AppBundle:Cms |
Dyn. nach Template-Name |
Fallback für Standard Pages:
Wenn die Page ein Template (z.B. "About") definiert hat, versucht das System AppBundle:Cms:About aufzurufen. Existiert diese Action nicht, wird AppBundle:Cms:Default verwendet und der Template-Name als Parameter übergeben.
5. Fehlerbehandlung
- 404: Wenn Pfad nicht gefunden und nicht in der Whitelist (
buchen,pdfetc.) ->HttpException(404). - Inaktiv: Wenn Page-Status
0ist ->NotFoundHttpException.