Start · Sprachen · PHP · Referenz · Yaf_Route_Regex

Yaf_Route_Regex

Klasse

Routet HTTP-Anfragen anhand eines regulären Ausdrucks und ordnet Treffer-Gruppen Controller, Action und weiteren Parametern zu.

seit PHP 2.0.0 Kategorie: misc

Signatur

class Yaf_Route_Regex extends Yaf_Route_Interface

Beschreibung

Yaf_Route_Regex ist eine der eingebauten Routing-Klassen des Yaf-Frameworks (Yet Another Framework). Sie erlaubt es, beliebig komplexe URL-Muster mittels regulärer Ausdrücke zu definieren und die Capture-Gruppen des Treffers auf Routen-Parameter (Modul, Controller, Action sowie eigene Parameter) abzubilden.

Die Klasse eignet sich besonders dann, wenn einfache statische oder segment-basierte Routen nicht ausreichen – zum Beispiel bei URLs mit optionalen Teilen, speziellen Trennzeichen oder mehrsprachigen Pfad-Strukturen. Der reguläre Ausdruck wird gegen den Request-URI geprüft; stimmt er überein, werden die definierten Standardwerte ($default) durch die benannten oder nummerierten Capture-Gruppen ergänzt oder überschrieben.

Über den Parameter $map lassen sich numerische Capture-Gruppen auf sprechende Parameter-Namen mappen. Ein optionaler $verify-Parameter erlaubt es, zusätzliche Prüfbedingungen als Array anzugeben.

Instanzen dieser Klasse werden typischerweise dem Yaf_Router über dessen Methode addRoute() hinzugefügt, bevor die Applikation gestartet wird.

Parameter

Name Typ Default Beschreibung
$match Pflicht string Der reguläre Ausdruck (PCRE-Syntax inkl. Trennzeichen), gegen den der Request-URI geprüft wird, z. B. '#^/blog/(\d+)/(\w+)$#'.
$default Pflicht array Assoziatives Array mit Standardwerten für module, controller und action, die gelten, wenn eine Capture-Gruppe fehlt oder nicht gemappt ist.
$map array [] Optionales Array, das numerische Capture-Gruppen (1-basiert) auf Parameter-Namen abbildet, z. B. [1 => 'id', 2 => 'slug'].
$verify array [] Optionales Array mit zusätzlichen Validierungsbedingungen für gemappte Parameter.

Beispiele

Einfache Regex-Route für Blog-Beiträge

<?php
// Bootstrap oder Bootstrap-Methode _initRoute()
$router = Yaf_Dispatcher::getInstance()->getRouter();

// URL-Muster: /blog/123/mein-titel
$route = new Yaf_Route_Regex(
    '#^/blog/(\d+)/([\w-]+)$#',   // regulärer Ausdruck
    [                               // Standardwerte
        'module'     => 'index',
        'controller' => 'blog',
        'action'     => 'view',
    ],
    [                               // Mapping der Capture-Gruppen
        1 => 'id',
        2 => 'slug',
    ]
);

$router->addRoute('blog_view', $route);

// Anfrage auf /blog/42/hello-world liefert:
// controller = blog, action = view, id = 42, slug = hello-world

Mehrsprachige Route mit optionalem Sprach-Präfix

<?php
$router = Yaf_Dispatcher::getInstance()->getRouter();

// URL-Muster: /de/news/list  oder  /en/news/list
$route = new Yaf_Route_Regex(
    '#^/([a-z]{2})/(\w+)/(\w+)$#i',
    [
        'module'     => 'index',
        'controller' => 'index',
        'action'     => 'index',
    ],
    [
        1 => 'lang',
        2 => 'controller',
        3 => 'action',
    ]
);

$router->addRoute('i18n', $route);

// Anfrage auf /de/news/list ergibt:
// controller = news, action = list, lang = de

// Wichtig · Fallstricke

Reihenfolge der Routen: Yaf prüft Routen in umgekehrter Reihenfolge der Registrierung (zuletzt hinzugefügte zuerst). Spezifische Regex-Routen sollten daher nach allgemeinen Routen hinzugefügt werden, damit sie Priorität erhalten.

Performance: Komplexe oder viele Regex-Routen können die Routing-Performance merklich beeinflussen, da jeder reguläre Ausdruck gegen die URL geprüft wird. Möglichst präzise und gut begrenzte Ausdrücke (Anfangs- und End-Anker ^/$) verwenden.

Sicherheit: Werte aus Capture-Gruppen werden als Routen-Parameter weitergegeben. Auch wenn Yaf intern keine direkte SQL- oder HTML-Ausgabe erzeugt, sollten diese Werte in Controllern und Views stets validiert und escaped werden.

Erweiterung: Yaf_Route_Regex implementiert Yaf_Route_Interface. Für sehr spezielle Anforderungen kann eine eigene Klasse, die dieses Interface implementiert, sinnvoller sein.