Route-Parser

Die Klasse RouteParser analysiert einfache Textdateien mit der Dateierweiterung .route. Der Aufbau der Datei ist sehr einfach gehalten. Es gibt neben Kommentaren und Leerzeilen zwei unterschiedliche Arten von Zeilen.

Route

Jede Zeile in der Datei definiert eine Route. Die Zeile gliedert sich in Spalten, die durch Leerzeichen getrennt werden. Die einzelnen Spalten haben dabei folgende Bedeutung:

  • Die HTTP Methode der Route oder ANY für alle Methoden
  • Ein Regex zum Prüfen der URL
  • Der Klassenname des Presenters
  • Die ID des Route-Objekts (Erlaubte Zeichen sind A-Z, 0-9, -)
  • Optionale Parameter in der Form key1=value,key2=value,key3="va lue"

Statische Pfade

Bei statischen Pfaden ist eine fest definierte Zeichenkette ohne regulären Ausdruck definiert. Außerdem ist diese Route auch noch über die ID aufrufbar. http://localhost/page/lists ist in diesem Fall also gleichbedeutend mit http://localhost/550e8400-e29b-11d4-a716-446655440002.

GET    /page/lists          \Application\App\Web\Page     550e8400-e29b-11d4-a716-446655440002

Pfade mit dynamischen Teilen

Bei Pfaden mit dynamischen Teilen kann entweder ein fester Wert, ein Wildcard oder ein regulärer Ausdruck für den dynamischen Teil verwendet werden. Der dynamische Teil muss dabei immer in geschweiften Klammern notiert werden.

GET    /page/{id}                           \Application\App\Web\Page    550e8400-e29b-11d4-a716-446655440000
GET    /page/{id}/sub/{[a-z]+name}          \Application\App\Web\Page    550e8400-e29b-11d4-a716-446655440001

Beispiele

# Das ist ein Kommenatar

# Dieser Eintrag trifft bei einer GET-Anfrage mit der URL /page/home zu und ruft
# den Presenter \Application\App\Web\Page auf. Dem Presenter wird der Parameter id=home mitgegeben.
GET    /page/home          \Application\App\Web\Page       550e8400-e29b-11d4-a716-446655440000     id:'home'

# Dieser Route trifft bei allen URL mit /page und einer Zahl zu, also /page/0, page/1, etc.
GET    /page/[0-9]+        \Application\App\Web\Page       550e8400-e29b-11d4-a716-446655440001

# Ein Beispiel für einen POST-Request
POST   /page/{id}          \Application\App\Web\Page       550e8400-e29b-11d4-a716-446655440002     name:'neue Seite'

Die ID der Route ist wichtig, da es immer nur eine Route mit einer ID geben kann.

Hinweis

Routen mit identischer ID überschreiben bereits definierte Routen.

Includes

Über das Schlüsselwort INCLUDE wird eine andere Route an dieser Stelle eingebunden. Der Aufbau der Spalten ist folgendemassen:

  • INCLUDE
  • externe Routingtabelle / Verzeichnis
  • optionale Eigenschaftsdatei

Als externe Routingtabelle kann jede Form, für die es einen Parser gibt eingebunden werden.

Wird als zweiter Parameter ein Verzeichnis definiert, so wird der dritte optionale Parameter nicht ausgewertet.

Hier einige Beispiele

# Einbinden einer anderen Routingtabelle
INCLUDE routing-01.route

# Einbinden einer XML-Routingtabellen
INCLUDE routing-02.xml

# Einbinden anderer Routingtabellen aus einem Verzeichnis
INCLUDE my/directory

# Einbinden einer XML-Routingtabellen mit Eigenschaftsdatei
INCLUDE routing-03.xml data.properties

# Einbinden einer Route aus einem Phar-Archive
# Das Phar-Archive muss aber bereits in PHP eingebunden worden sein.
INCLUDE phar://myphar.phar/config/route/my.xml

Bei der Einbindung einer XML-Routingtabelle besteht die Möglichkeit eine Eigenschaftsdatei zu übergeben. Dadurch kann eine XML-Datei für mehrere Routen verwendet werden.

Wurde zum Beispiel eine XML-Routingtabelle definiert, in der sich nur die Route und die ID ändert, so wird die XML-Datei mehrfach eingebunden und in der Eigenschaftsdatei die Werte definiert.

route.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definition>
    <routes>
        <group>
            <route id="%{id}">
                <presenter>%{presenter}</presenter>
                <method>%{method}</method>
                <pattern><![CDATA[%{route}]]></pattern>
                <configuration>
    ...                

01.properties

id=route1
presenter=MyPresenter
method=GET
route=/home/

02.properties

id=route2
presenter=MyPresenter
method=POST
route=/contact/

my-route.route

INCLUDE route.xml 01.properties
INCLUDE route.xml 02.properties

Das Ergebnis sind zwei Routen mit der ID route1 und route2, die beide über die gleiche XML definiert wurden.