Start · Sprachen · PHP · Referenz · Yaf_Dispatcher

Yaf_Dispatcher

Klasse

Initialisiert die Anfrageumgebung, routet und dispatcht eingehende HTTP-Anfragen im Yaf-Framework.

seit PHP 2.0.0 Kategorie: misc

Signatur

class Yaf_Dispatcher

Beschreibung

Yaf_Dispatcher ist das Herzstück des Yet Another Framework (Yaf) und verantwortlich für den gesamten Request-Lifecycle: Initialisierung der Anfrageumgebung, Routing, Dispatching und Ausführung von Action-Methoden in Controllern. Die Klasse implementiert das Singleton-Pattern – es existiert stets genau eine Instanz, die über Yaf_Dispatcher::getInstance() abgerufen wird.

Der Dispatcher orchestriert das Zusammenspiel von Yaf_Request_Abstract, Yaf_Router und Yaf_Response_Abstract. Er ruft Plugin-Hooks (routerStartup, routerShutdown, dispatchLoopStartup, preDispatch, postDispatch, dispatchLoopShutdown) auf und ermöglicht so eine feine Steuerung des Anfrageflusses ohne den Core-Code zu verändern.

Typischerweise wird Yaf_Dispatcher in der Bootstrap-Datei (z. B. Bootstrap.php) initialisiert und konfiguriert. Über Methoden wie setView(), registerPlugin(), setRequest() und throwException() lässt sich das Verhalten des Frameworks umfassend anpassen.

Da Yaf_Dispatcher als PHP-Extension implementiert ist, ist die Performance deutlich höher als bei rein PHP-basierten Frameworks. Der Dispatcher unterstützt sowohl automatisches als auch manuelles Rendering und bietet durch disableView() und autoRender() flexible Rendering-Optionen, z. B. für JSON-APIs.

Beispiele

Grundlegende Initialisierung einer Yaf-Applikation

<?php
// index.php (Front-Controller / Entry-Point)
define('APPLICATION_PATH', dirname(__FILE__));

$application = new Yaf_Application(APPLICATION_PATH . '/conf/application.ini');

// Dispatcher wird intern durch Yaf_Application erstellt;
// hier expliziter Zugriff via Singleton
$dispatcher = Yaf_Dispatcher::getInstance();

// Exceptions an den Client weitergeben (statt sie zu schlucken)
$dispatcher->throwException(true);

// Anwendung starten: Bootstrap -> dispatch -> Ausgabe
$application->bootstrap()->run();

Plugin registrieren und View deaktivieren (JSON-API)

<?php
// Bootstrap.php
class Bootstrap extends Yaf_Bootstrap_Abstract {

    public function _initPlugin(Yaf_Dispatcher $dispatcher): void {
        // Eigenes Plugin für Auth-Checks registrieren
        $dispatcher->registerPlugin(new AuthPlugin());
    }

    public function _initView(Yaf_Dispatcher $dispatcher): void {
        // Kein Template-Rendering – wir liefern JSON aus
        $dispatcher->disableView();
    }
}

// AuthPlugin.php
class AuthPlugin extends Yaf_Plugin_Abstract {
    public function preDispatch(
        Yaf_Request_Abstract $request,
        Yaf_Response_Abstract $response
    ): void {
        $token = $request->getServer('HTTP_X_API_TOKEN');
        if ($token !== 'geheim123') {
            $response->setBody(json_encode(['error' => 'Unauthorized']));
            // Dispatch-Loop unterbrechen
            $request->setDispatched(true);
        }
    }
}

Eigenes Request-Objekt und eigenen Router setzen

<?php
$application = new Yaf_Application('/pfad/zur/application.ini');
$dispatcher  = Yaf_Dispatcher::getInstance();

// CLI-Anfrage simulieren
$request = new Yaf_Request_Simple(
    'CLI',      // method
    'index',    // module
    'index',    // controller
    'index'     // action
);
$dispatcher->setRequest($request);

// Statische Route manuell hinzufügen
$router = $dispatcher->getRouter();
$router->addRoute(
    'api',
    new Yaf_Route_Regex(
        '#^/api/v1/(?P<resource>[a-z]+)#',
        ['controller' => 'Api', 'action' => 'handle'],
        ['resource'   => 1]
    )
);

$application->run();

// Wichtig · Fallstricke

Singleton-Pattern: Yaf_Dispatcher kann nicht direkt mit new instanziert werden – der Konstruktor ist privat. Nutze stets Yaf_Dispatcher::getInstance().

Exception-Handling: Standardmäßig schluckt Yaf Exceptions und leitet auf den Error-Controller um. Mit throwException(true) werden Exceptions normal geworfen und können von einem eigenen Error-Handler gefangen werden. In Produktionsumgebungen sollte dies sorgfältig abgewogen werden, um keine sensiblen Stack-Traces preiszugeben.

Dispatch-Schleife: Yaf führt standardmäßig mehrere Dispatch-Iterationen aus (forward-Unterstützung). Mit setMaxForward(int $max) kann die maximale Anzahl an Weiterleitungen begrenzt werden, um Endlosschleifen zu verhindern.

Extension erforderlich: Yaf ist eine C-Extension (ext/yaf) und muss in der php.ini aktiviert sein (extension=yaf.so). Reine Composer-Installationen sind nicht möglich.