Hooks und Events
Übersicht
Abschnitt betitelt „Übersicht“XOOPS bietet Hooks und Events als Erweiterungspunkte, die Modulen ermöglichen, mit Core-Funktionalität und miteinander zu interagieren, ohne direkte Abhängigkeiten.
Hooks vs Events
Abschnitt betitelt „Hooks vs Events“| Aspekt | Hooks | Events |
|---|---|---|
| Zweck | Verhalten/Daten ändern | Auf Vorkommen reagieren |
| Rückgabe | Kann geänderte Daten zurückgeben | Typischerweise void |
| Timing | Vor/während Aktion | Nach Aktion |
| Pattern | Filter Chain | Observer/Pub-Sub |
Hook System
Abschnitt betitelt „Hook System“Hooks registrieren
Abschnitt betitelt „Hooks registrieren“// Hook in xoops_version.php registrieren$modversion['hooks'][] = [ 'name' => 'user.profile.display', 'callback' => 'mymodule_hook_user_profile', 'priority' => 10,];Hook Callback
Abschnitt betitelt „Hook Callback“function mymodule_hook_user_profile(array $data): array{ $userId = $data['user_id'];
// Custom Profile Felder hinzufügen $data['fields']['reputation'] = mymodule_get_user_reputation($userId); $data['fields']['badges'] = mymodule_get_user_badges($userId);
return $data;}Verfügbare Core Hooks
Abschnitt betitelt „Verfügbare Core Hooks“| Hook Name | Data | Beschreibung |
|---|---|---|
user.profile.display | User Data Array | Profil-Anzeige ändern |
content.render | Content HTML | Content-Ausgabe filtern |
form.submit | Form Data | Form-Daten validieren/ändern |
search.results | Results Array | Such-Ergebnisse filtern |
menu.main | Menu Items | Hauptmenü ändern |
Event System
Abschnitt betitelt „Event System“Events Dispatching
Abschnitt betitelt „Events Dispatching“// In Ihrem Modul-Code$eventHandler = xoops_getHandler('event');
$eventHandler->trigger('mymodule.article.created', [ 'article_id' => $article->id(), 'author_id' => $article->authorId(), 'title' => $article->title(),]);Events Listening
Abschnitt betitelt „Events Listening“class MyModulePreload extends \Xmf\Module\Helper\AbstractHelper{ public function eventMymoduleArticleCreated(array $args): void { $articleId = $args['article_id'];
// Abonnenten benachrichtigen $this->notifyNewArticle($articleId); }
public function eventUserLogin(array $args): void { $userId = $args['userid'];
// Benutzer-Aktivität im Modul aktualisieren $this->updateUserActivity($userId); }}Preload Events Referenz
Abschnitt betitelt „Preload Events Referenz“Core Events
Abschnitt betitelt „Core Events“// Header/Footerpublic function eventCoreHeaderStart(array $args): void {}public function eventCoreHeaderEnd(array $args): void {}public function eventCoreFooterStart(array $args): void {}public function eventCoreFooterEnd(array $args): void {}
// Includespublic function eventCoreIncludeCommonStart(array $args): void {}public function eventCoreIncludeCommonEnd(array $args): void {}
// Exceptionspublic function eventCoreException(array $args): void {}User Events
Abschnitt betitelt „User Events“public function eventUserLogin(array $args): void {}public function eventUserLogout(array $args): void {}public function eventUserRegister(array $args): void {}public function eventUserActivate(array $args): void {}public function eventUserDelete(array $args): void {}Module Events
Abschnitt betitelt „Module Events“public function eventSystemModuleInstall(array $args): void {}public function eventSystemModuleUninstall(array $args): void {}public function eventSystemModuleUpdate(array $args): void {}public function eventSystemModuleActivate(array $args): void {}public function eventSystemModuleDeactivate(array $args): void {}Custom Module Events
Abschnitt betitelt „Custom Module Events“Events definieren
Abschnitt betitelt „Events definieren“// Event-Konstanten definierenclass ArticleEvents{ public const CREATED = 'mymodule.article.created'; public const UPDATED = 'mymodule.article.updated'; public const DELETED = 'mymodule.article.deleted'; public const PUBLISHED = 'mymodule.article.published';}Events Triggering
Abschnitt betitelt „Events Triggering“class ArticleService{ public function publish(Article $article): void { $article->publish(); $this->repository->save($article);
// Event triggern $GLOBALS['xoopsPreload']->triggerEvent( ArticleEvents::PUBLISHED, ['article' => $article] ); }}Module Events Listening
Abschnitt betitelt „Module Events Listening“// In Preload.php eines anderen Moduls
public function eventMymoduleArticlePublished(array $args): void{ $article = $args['article'];
// Für Suche indexieren $this->searchIndexer->index($article);
// Sitemap aktualisieren $this->sitemapGenerator->addUrl($article->url());}Best Practices
Abschnitt betitelt „Best Practices“- Verwenden Sie spezifische Namen -
module.entity.actionFormat - Übergeben Sie minimale Daten - Nur was Listener brauchen
- Dokumentieren Sie Events - Listen Sie Events in Modul-Docs auf
- Vermeiden Sie Nebenwirkungen - Halten Sie Listener fokussiert
- Behandeln Sie Fehler - Lassen Sie nicht Listener-Fehler den Flow brechen
Verwandte Dokumentation
Abschnitt betitelt „Verwandte Dokumentation“- Event-System - Detaillierte Event-Dokumentation
- ../03-Module-Development/Module-Development - Modul-Entwicklung
- ../07-XOOPS-4.0/Implementation-Guides/Event-System-Guide - PSR-14 Events