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