Signatur
Beschreibung
Yaf_Router ist der Standard-Router des Yet Another Framework (Yaf). Seine Hauptaufgabe besteht darin, eine eingehende HTTP-URI zu analysieren und sie in die drei Grundkomponenten einer Yaf-Anfrage aufzulösen: Modul, Controller und Action. Das Ergebnis des Routing-Prozesses wird im Yaf_Request-Objekt gespeichert und von der weiteren Dispatch-Pipeline genutzt.
Der Router verwaltet intern eine geordnete Liste von Yaf_Route_Interface-Implementierungen. Beim Eintreffen einer Anfrage werden die registrierten Routen in umgekehrter Reihenfolge (LIFO – zuletzt hinzugefügte Route zuerst) geprüft, bis eine Route die URI erfolgreich matcht. Trifft keine der benutzerdefinierten Routen zu, greift Yaf auf die eingebaute Yaf_Route_Static-Standardroute zurück.
Neue Routen können mit addRoute() oder addConfig() hinzugefügt werden. Letztere erlaubt es, Routen bequem aus einem Yaf_Config-Objekt oder einem assoziativen Array zu laden, was sich besonders für konfigurationsbasierte Routing-Definitionen eignet. Mit getRoutes() und getRoute() lassen sich registrierte Routen jederzeit abrufen.
Typischerweise wird Yaf_Router nicht direkt instanziiert, sondern über Yaf_Application::getDispatcher()->getRouter() abgerufen und dort konfiguriert, etwa im Bootstrap-Prozess der Anwendung.
Beispiele
Router im Bootstrap konfigurieren
<?php
class Bootstrap extends Yaf_Bootstrap_Abstract {
public function _initRoute(Yaf_Dispatcher $dispatcher): void {
$router = $dispatcher->getRouter();
// Eine Regex-Route für API-Endpunkte hinzufügen
$route = new Yaf_Route_Regex(
'#^/api/([a-z]+)/([0-9]+)$#',
[
'module' => 'api',
'controller' => 'resource',
'action' => 'view',
],
[
1 => 'type',
2 => 'id',
]
);
$router->addRoute('api_resource', $route);
// Alle registrierten Routen ausgeben
$routes = $router->getRoutes();
foreach ($routes as $name => $routeObj) {
echo $name . ': ' . get_class($routeObj) . PHP_EOL;
}
}
}
Routen aus einer Konfiguration laden
<?php
class Bootstrap extends Yaf_Bootstrap_Abstract {
public function _initRoute(Yaf_Dispatcher $dispatcher): void {
$router = $dispatcher->getRouter();
// Routen als Array-Konfiguration definieren
$routeConfig = [
'blog' => [
'type' => 'rewrite',
'match' => '/blog/:year/:slug',
'route' => [
'module' => 'default',
'controller' => 'blog',
'action' => 'post',
],
],
'user' => [
'type' => 'simple',
'match' => '/user',
'route' => [
'controller' => 'user',
'action' => 'index',
],
],
];
$config = new Yaf_Config_Simple($routeConfig);
$router->addConfig($config);
// Einzelne Route abrufen
$blogRoute = $router->getRoute('blog');
if ($blogRoute instanceof Yaf_Route_Interface) {
echo 'Blog-Route erfolgreich registriert: ' . get_class($blogRoute) . PHP_EOL;
}
}
}
// Wichtig · Fallstricke
LIFO-Reihenfolge: Routen werden in umgekehrter Hinzufüge-Reihenfolge geprüft. Die zuletzt registrierte Route hat die höchste Priorität. Die eingebaute Standardroute (__default__) wird stets zuletzt geprüft.
Yaf-Extension erforderlich: Yaf_Router ist Teil der PECL-Extension yaf, die als C-Extension installiert sein muss (pecl install yaf). Sie ist nicht im PHP-Kern enthalten.
Keine direkte Instanziierung nötig: In der Regel sollte Yaf_Router nicht mit new erzeugt werden. Der korrekte Zugriff erfolgt über Yaf_Dispatcher::getInstance()->getRouter() oder im Bootstrap über den übergebenen $dispatcher.