Signatur
Beschreibung
Yaf_Plugin_Abstract ist die Basisklasse für alle Plugins im Yaf-Framework (Yet Another Framework). Plugins ermöglichen es, in verschiedene Phasen des Request-Dispatch-Zyklus einzugreifen, ohne den eigentlichen Controller-Code zu verändern. Typische Einsatzgebiete sind Authentifizierung, Logging, Caching oder das Setzen von Layouts.
Eigene Plugins werden erstellt, indem man eine Klasse von Yaf_Plugin_Abstract ableitet und die gewünschten Hook-Methoden überschreibt. Das Plugin muss anschließend über den Yaf_Dispatcher registriert werden, damit es aktiv wird.
Die Klasse definiert folgende Hook-Methoden, die im Dispatch-Zyklus aufgerufen werden und überschrieben werden können: routerStartup, routerShutdown, dispatchLoopStartup, dispatchLoopShutdown, preDispatch und postDispatch. Jede dieser Methoden empfängt ein Yaf_Request_Abstract- und ein Yaf_Response_Abstract-Objekt als Parameter.
- routerStartup: Wird vor dem Routing aufgerufen.
- routerShutdown: Wird nach dem Routing aufgerufen.
- dispatchLoopStartup: Wird zu Beginn der Dispatch-Schleife aufgerufen.
- dispatchLoopShutdown: Wird am Ende der Dispatch-Schleife aufgerufen.
- preDispatch: Wird vor jedem Dispatch-Durchlauf aufgerufen.
- postDispatch: Wird nach jedem Dispatch-Durchlauf aufgerufen.
Beispiele
Einfaches Authentifizierungs-Plugin
<?php
class AuthPlugin extends Yaf_Plugin_Abstract {
/**
* Wird nach dem Routing aufgerufen – hier wird geprüft, ob der Nutzer eingeloggt ist.
*/
public function routerShutdown(
Yaf_Request_Abstract $request,
Yaf_Response_Abstract $response
): void {
$controller = $request->getControllerName();
// Den Login-Controller von der Prüfung ausnehmen
if (strtolower($controller) === 'login') {
return;
}
if (empty($_SESSION['user_id'])) {
// Nicht eingeloggt: Umleitung zum Login
$request->setControllerName('Login');
$request->setActionName('index');
}
}
}
// Plugin beim Dispatcher registrieren
$dispatcher = Yaf_Dispatcher::getInstance();
$dispatcher->registerPlugin(new AuthPlugin());
Logging-Plugin für alle Requests
<?php
class LogPlugin extends Yaf_Plugin_Abstract {
/**
* Wird zu Beginn der Dispatch-Schleife aufgerufen.
*/
public function dispatchLoopStartup(
Yaf_Request_Abstract $request,
Yaf_Response_Abstract $response
): void {
$uri = $request->getRequestUri();
$method = $request->getMethod();
$time = date('Y-m-d H:i:s');
error_log("[{$time}] {$method} {$uri}");
}
/**
* Wird am Ende der Dispatch-Schleife aufgerufen.
*/
public function dispatchLoopShutdown(
Yaf_Request_Abstract $request,
Yaf_Response_Abstract $response
): void {
$uri = $request->getRequestUri();
$time = date('Y-m-d H:i:s');
error_log("[{$time}] Dispatch abgeschlossen für: {$uri}");
}
}
// Plugin registrieren
Yaf_Dispatcher::getInstance()->registerPlugin(new LogPlugin());
// Wichtig · Fallstricke
Hinweis zur Reihenfolge: Mehrere registrierte Plugins werden in der Reihenfolge ihrer Registrierung aufgerufen. Die Reihenfolge kann das Verhalten der Applikation beeinflussen, insbesondere wenn Plugins denselben Request modifizieren.
Nicht implementierte Methoden: Hook-Methoden, die im eigenen Plugin nicht überschrieben werden, führen keinen Code aus – es ist daher nicht notwendig, alle sechs Methoden zu implementieren.
Namespace-Variante: Im Yaf-Namespace-Modus lautet die Klasse Yaf\Plugin_Abstract.