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 „/“.
[crayon-5c6b912a6cdaa738768179/]
Damit ich später auf jedes Element zugreifen kann teile ich diesen String auf:
[crayon-5c6b912a6cdb0220852264/]
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:
[crayon-5c6b912a6cdb1317802240/]
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.
[crayon-5c6b912a6cdb2464720662/]
Das nächste Element muss die Funktion sein welche aufgerufen werden soll.
[crayon-5c6b912a6cdb3632496461/]
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:
[crayon-5c6b912a6cdb4894200468/]
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.
[crayon-5c6b912a6cdb5834397136/]
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:
[crayon-5c6b912a6cdb6310832546/]
Das war das ganze Hexenwerk. Bei Verbesserungsvorschläge oder Fragen einfach einen Kommentar hinterlassen.
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
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.
ich würde aber trotzdem $_GET verwenden,
abgesehen davon musst du dann ja nicht selber das array bauen.
wie bereits oben geschrieben, erwartest du doch eh get-parameter oder?
(wobei man alternativ noch $_SERVER[‚QUERY_STRING‘] verwenden könnte)
http://se2.php.net/manual/en/reserved.variables.server.php
die idee an sich ist schon gut.
ich würde es nur der einfachheit halber halt etwas anders bauen 😉