Ein einfaches URL Routing mit PHP

Wenn man größere PHP Anwendungen schreibt hat man oft URLs wie etwa index.php?id=12&var1=das&var2=ist&var3=ein&var4=Beispiel
Das sieht uncool aus und ist auch unpraktisch. Besser wäre eine URL in der Form index.php/12/das/ist/ein/beispiel .

Mein Zeil eines solchen Routings ist nicht nur das es besser aussieht sondern mein Restlichen PHP Quellcode vor dem Benutzer zu verstecken. Deshalb soll meine index.php zum Controller sowie zur Funktion (spezielle Action-Function) innerhalb des Controllers Routen. Sprich die Urls sollen später folgende Form haben: index.php/controller/function/var0/var1/…/varN/

URL auslesen und aufteilen

Die komplette URL der aufgerufenen Webseite steht in der $_SERVER[“REQUEST_URI”] als String. Damit ich sicher bin das keine Leerzeichen im Anfang und Ende stehen entferne ich diese sowie (falls eins vorhanden ist) das letzte “/”.

Damit ich später auf jedes Element zugreifen kann teile ich diesen String auf:

Jetzt  habe ich ein Array mit dem man einfacher arbeiten kann. Wenn das Script aber nicht im Root Verzeichnis der Webservers liegt hat man auch den Verzeichnis-Namen als erstes Element. Dieses entferne ich einfach mit einer Abfrage:

 Controller und Funktion aufrufen

In meiner Logik müsste das erste Element in meinem Array nun der Controller sein. Der Controller liegt im Verzeichnis (und im Namespace) controller.

Das nächste Element muss die Funktion sein welche aufgerufen werden soll.

Damit nicht jede Funktion aufgerufen wird erweitere ich den Funktionennamen mit einem “_action”. Das soll die Sicherheit etwas erhöhen und den Quellcode übersichtlicher machen.

Der eigentliche Aufruf läuft nun so ab:

 ArGUMENTE AUSLESEN

Da die Argumente der Funktion auch in dem Array $elements gespeichert sind müssen nur noch die nachfolgende Elemente in ein neues Array übergeben werden.

Das war schon das ganze. Man sollte einen Standard Funktion und Controller angeben wenn diese nicht angegeben werden.

Index.php entfernen

Will man auch das index.php aus der URL haben dann erstellt man eine .htaccess Datei mit folgendem Inhalt:

Das war das ganze Hexenwerk. Bei Verbesserungsvorschläge oder Fragen einfach einen Kommentar hinterlassen.

Johannes

Hauptberuflich bin ich im Bereich Filesecurity unterwegs und schütze die Daten meines Arbeitgebers vor internen und externen Gefahren. Nebenberuflich helfe ich KMUs als IT-Consultent bei der IT-Strategie sowie bei der Entwicklung von Webanwendungen.

3 thoughts to “Ein einfaches URL Routing mit PHP”

  1. Warum nicht einfach $_GET?
    Wenn eh GET Parameter erwartet werden, hat man die entsprechenden Werte dann gleich als Array.

    $foo = $_GET;
    echo $foo[‘id’]; // 12

  2. Das Ziel ist ja nicht einfach Parameter über eine Url zu bekommen sondern schöne und aussagekräftige Urls zu bekommen.

    Ich baue gerade an einem Projekt bei dem man direkt auf die Objekte Verlinken können soll.

    Beispiel: Belegung des Raums 12 in der KW 10
    index.php/room/showassignment/12/10
    ist einfacher zu merken als:
    Index.php?controller=room&function=showassignment&room=12&week=10

    technisch geht beides. Ich finde meine “Lösung” nur schöner.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.