# 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`.