Appearance
Pre- und PostActionHooks
Die Action Hooks sind Yii2-Komponenten, die es ermöglichen, Code vor oder nach jeder Controller-Action auszuführen. Sie nutzen das Event-System von Yii2, um sich in den Request-Lifecycle einzuklinken.
Konzept
In Yii2 löst jede Controller-Action zwei Events aus:
EVENT_BEFORE_ACTION- Vor der Action-AusführungEVENT_AFTER_ACTION- Nach der Action-Ausführung
Die Action Hooks registrieren Listener auf diese Events und führen zentrale Logik aus, ohne dass bestehende Controller modifiziert werden müssen.
Registrierung
Beide Komponenten sind in src/config/coreComponents.php als Core-Komponenten registriert:
php
'preActionHooks' => [
'class' => \app\components\PreActionHooks::class
],
'postActionHooks' => [
'class' => PostActionHooks::class
]Dadurch werden sie bei jedem Request automatisch initialisiert.
PreActionHooks
Die PreActionHooks-Komponente wird vor jeder Controller-Action ausgeführt. Sie dient primär zur:
- Configuration-Injection: Laden von dynamischen Einstellungen aus der Datenbank in
Yii::$app->params - Behavior-Injection: Dynamisches Anhängen von Behaviors (z.B. AccessControl) an externe Module
Anwendungsfälle
| Anwendungsfall | Beschreibung |
|---|---|
| Mail-Konfiguration | Lädt Absender- und Antwort-Mailadressen aus den Einstellungen |
| HealthCheck-Cache | Konfiguriert die Cache-Dauer für Health-Checks |
| Modul-Zugriffskontrolle | Fügt AccessControl-Behaviors zu externen Modulen hinzu |
Vorteile
- Externe Module (BackgroundJobs, AuditLog) können mit Zugriffsbeschränkungen versehen werden, ohne deren Code zu ändern
- Einstellungen aus der Datenbank werden einmalig pro Request geladen und sind danach überall verfügbar
PostActionHooks
Die PostActionHooks-Komponente wird nach jeder Controller-Action ausgeführt. Sie dient zur:
- Nachträglichen Datenerfassung: Protokollierung oder Audit-Logging basierend auf dem Ergebnis einer Action
Anwendungsfälle
| Anwendungsfall | Beschreibung |
|---|---|
| TracingAudit | Erstellt Audit-Einträge für TC-Linienproduktion nach erfolgreichen Tracing-Requests |
Bedingte Registrierung
PostActionHooks können ihre Event-Listener bedingt registrieren:
php
public function init()
{
parent::init();
if (Licenses::findOne(['module' => 'tclineproduction'])->license) {
Yii::$app->on(Module::EVENT_AFTER_ACTION, [$this, 'addTracingAudit']);
}
}Dies ermöglicht lizenzbasierte Aktivierung von Funktionalität.
Vergleich
| Aspekt | PreActionHooks | PostActionHooks |
|---|---|---|
| Zeitpunkt | Vor der Action | Nach der Action |
| Event | EVENT_BEFORE_ACTION | EVENT_AFTER_ACTION |
| Typische Nutzung | Konfiguration, Zugriffskontrolle | Logging, Audit, Nachverarbeitung |
| Request-Daten | Vollständig verfügbar | Vollständig verfügbar inkl. Response |
Erweiterung
Um neue Hooks hinzuzufügen:
- Neue Methode in der entsprechenden Hook-Klasse erstellen
- Event-Binding in
init()hinzufügen - Optional: Lizenz- oder Bedingungsprüfung implementieren
php
public function init()
{
parent::init();
Yii::$app->on(Module::EVENT_BEFORE_ACTION, [$this, 'myNewHook']);
}
public function myNewHook(): void
{
// Hook-Logik
}Vorteile des Hook-Ansatzes
- Entkopplung: Zentrale Logik ohne Änderungen an einzelnen Controllern
- Wartbarkeit: Alle Hooks an einem Ort
- Flexibilität: Bedingte Aktivierung basierend auf Lizenzen oder Konfiguration
- Testbarkeit: Hooks können isoliert getestet werden