Start · Sprachen · PHP · Referenz · Yaf_Router

Yaf_Router

Klasse

Standard-Router des Yaf-Frameworks, zerlegt eine URI in Modul, Controller und Action.

seit PHP 2.0.0 Kategorie: misc

Signatur

class Yaf_Router

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;
        }
    }
}
api_resource: Yaf_Route_Regex __default__: Yaf_Route_Static

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;
        }
    }
}
Blog-Route erfolgreich registriert: Yaf_Route_Rewrite

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