23-01-2026

This commit is contained in:
Kevin Adametz 2026-01-23 17:34:40 +01:00
parent 8fd1f4d451
commit 389d5d1820
59 changed files with 9642 additions and 883 deletions

View file

@ -0,0 +1,47 @@
# 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`.