Was ist Routing?

Bei WebsiteBaker und LEPTON müssen alle aufrufbaren Pfade (z.B. http://www.yourdomain.com/pages/demo.php) auch tatsächlich existierenden Verzeichnissen und Dateien entsprechen. Das führt dazu, dass hunderte kleine Dateien herumliegen und viele Aktionen - wie z.B. das Prüfen von Berechtigungen - immer wieder eingebaut werden müssen. Auch wenn das meist "Copy & Paste" ist, bläht es doch die Dateien auf und kann zudem leicht mal vergessen werden.

Mit Hilfe von Routing, das beim Apache Webserver auf der RewriteEngine basiert, kann man diese Problematik umgehen. Die meisten modernen CMS handhaben das längst so.

Beispiel:

URL in BC 1.x: http://www.yourdomain.com/backend/pages/modify.php?page_id=5
URL in BC 2.x: http://www.yourdomain.com/backend/pages/edit/5

 

In BC 1.x existiert tatsächlich ein Verzeichnis <CAT_PATH>/backend/pages und dort ein Script modify.php.

In BC 2.x existiert lediglich das Verzeichnis <CAT_PATH>/backend; alles andere sind "virtuelle Routen", die zu einem internen Controller führen. In obigem Beispiel existiert eine Klasse CAT_Backend_Pages, die eine Funktion edit() bereitstellt, die die ID der zu bearbeitenden Seite als Parameter in der Route (=URL) erwartet.

 

Route Helper

Die neue Helperklasse CAT_Helper_Route beinhaltet die notwendigen Funktionen für die Handhabung von Routen sowie einige Hilfsfunktionen. Sie ermittelt unter anderem den Namen der zuständigen Controllerklasse sowie der aufzurufenden Methode innerhalb dieser Klasse. Zudem speichert sie die zusätzlich übergebenen Parameter (wie oben die Seiten-ID 5).

Um beispielsweise den Namen des Controllers zu ermitteln, kann in allen Klassen, die von CAT_Object abgeleitet sind, die Methode

$this->router()->getController()

verwendet werden. Die Methode router() ist ein Accessor zum aktuellen CAT_Helper_Route-Objekt.

Weitere Methoden:

alle Parameter auslesen $this->router()->getParams()
einen bestimmten Parameter auslesen $this->router()->getParam(<Index>)
einen bestimmten Parameter auslesen und diesen aus dem Speicher löschen $this->router()->getParam(<Index>,true)
Namen der aufzurufenden Funktion auslesen $this->router()->getFunction()
Namen der aufzurufenden Funktion ändern $this->router()->setFunction(<Name>)
Route (=Funktion im Controller) ausführen $this->router()->dispatch()
Route absichern $this->router()->protect(<Berechtigung>)

 

Was bringt das?

Neben den oben schon genannten Vorteilen vor allem für das Backend gibt es auch einen interessanten Nutzen für das Frontend. Nutzt man die gleiche Methodik nämlich auch dort, können die sogenannten "Access Files" - also die Dateien im page-Verzeichnis, die hartcodiert die Seitennummer setzen und dann die index.php aufrufen - komplett entfallen. Genau genommen kann sogar das page-Verzeichnis selbst entfallen. Letztendlich könnte der Administrator den Aufrufpfad einer Seite komplett so anpassen, wie er möchte. (Wobei es nach wie vor sinnvoll ist, den "Pfad" - also [Rootseite] ⇒ [Ebene1] ⇒ [Ebene2] ⇒ [aktuelle Seite] auch in der URL widerzuspiegeln.)

Wie wir das in BC2 für das Frontend letztlich umsetzen, steht noch nicht fest.