Signatur
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.