mein-sterntours/dev/frontend-navigation/navigation.md
2026-01-23 17:34:40 +01:00

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 über slug und 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, pdf etc.) -> HttpException(404).
  • Inaktiv: Wenn Page-Status 0 ist -> NotFoundHttpException.