Start · Sprachen · PHP · Referenz · Yaf_Plugin_Abstract

Yaf_Plugin_Abstract

Klasse

Abstrakte Basisklasse für Yaf-Plugins, die das Eingreifen in den Request-Dispatch-Prozess des Yaf-Frameworks ermöglicht.

seit PHP 2.0.0 Kategorie: misc

Signatur

abstract class Yaf_Plugin_Abstract

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.