XOOPS-gebeurtenissysteem
2.5.x: vooraf geladen 4.0.x: PSR-14
Overzicht
Section titled “Overzicht”Het XOOPS-gebeurtenissysteem maakt losse koppeling tussen modules mogelijk via een waarnemerspatroon. Componenten kunnen gebeurtenissen uitzenden waar andere delen van het systeem naar kunnen luisteren en waarop ze kunnen reageren.
Gebeurtenistypen
Section titled “Gebeurtenistypen”Kerngebeurtenissen
Section titled “Kerngebeurtenissen”| Evenement | Triggerpunt |
|---|---|
core.header.start | Vóór headerverwerking |
core.header.end | Na headerverwerking |
core.footer.start | Vóór weergave van de voettekst |
core.footer.end | Na weergave van de voettekst |
core.exception | Wanneer er een uitzondering optreedt |
Modulelevenscyclusgebeurtenissen
Section titled “Modulelevenscyclusgebeurtenissen”| Evenement | Triggerpunt |
|---|---|
module.install | Na module-installatie |
module.update | Na module-update |
module.uninstall | Vóór verwijdering van de module |
module.activate | Wanneer module geactiveerd |
module.deactivate | Wanneer module gedeactiveerd |
Gebruikersgebeurtenissen
Section titled “Gebruikersgebeurtenissen”| Evenement | Triggerpunt |
|---|---|
user.login | Na succesvol inloggen |
user.logout | Na uitloggen |
user.register | Na registratie |
user.delete | Voordat de gebruiker wordt verwijderd |
Preload-systeem (verouderd)
Section titled “Preload-systeem (verouderd)”Een voorlading maken
Section titled “Een voorlading maken”<?phpnamespace XoopsModules\MyModule;
use Xmf\Module\Helper\AbstractHelper;
final class Preload extends AbstractHelper{ public function eventCoreHeaderStart(array $args): void { // Runs on every page before header }
public function eventCoreFooterStart(array $args): void { // Runs before footer renders }
public function eventUserLogin(array $args): void { $userId = $args['userid']; // Handle login event }
public function eventCoreException(array $args): void { $exception = $args['exception']; // Log or handle exception }}Naamgeving van gebeurtenismethode
Section titled “Naamgeving van gebeurtenismethode”event{Category}{Action}
Examples:- eventCoreHeaderStart- eventUserLogin- eventModuleNewsArticleCreatePSR-14 Gebeurtenisverzender (XOOPS 4.0)
Section titled “PSR-14 Gebeurtenisverzender (XOOPS 4.0)”Evenementklasse
Section titled “Evenementklasse”<?php
declare(strict_types=1);
namespace XoopsModules\MyModule\Event;
final class ArticleCreatedEvent{ public function __construct( public readonly int $articleId, public readonly int $authorId, public readonly string $title, public readonly \DateTimeImmutable $createdAt ) {}}Verzendevenementen
Section titled “Verzendevenementen”use Psr\EventDispatcher\EventDispatcherInterface;
final class ArticleService{ public function __construct( private readonly ArticleRepository $repository, private readonly EventDispatcherInterface $dispatcher ) {}
public function create(CreateArticleDTO $dto): Article { $article = Article::create($dto); $this->repository->save($article);
// Dispatch event $this->dispatcher->dispatch(new ArticleCreatedEvent( articleId: $article->getId(), authorId: $article->getAuthorId(), title: $article->getTitle(), createdAt: new \DateTimeImmutable() ));
return $article; }}Gebeurtenisluisteraar
Section titled “Gebeurtenisluisteraar”<?php
declare(strict_types=1);
namespace XoopsModules\MyModule\Listener;
use XoopsModules\MyModule\Event\ArticleCreatedEvent;
final class SendNotificationOnArticleCreated{ public function __construct( private readonly NotificationService $notifications ) {}
public function __invoke(ArticleCreatedEvent $event): void { $this->notifications->notifySubscribers( 'new_article', [ 'article_id' => $event->articleId, 'title' => $event->title, ] ); }}Luisteraars registreren
Section titled “Luisteraars registreren”return [ ArticleCreatedEvent::class => [ SendNotificationOnArticleCreated::class, UpdateSearchIndex::class, ClearArticleCache::class, ],
ArticleUpdatedEvent::class => [ UpdateSearchIndex::class, ClearArticleCache::class, ],
ArticleDeletedEvent::class => [ RemoveFromSearchIndex::class, ClearArticleCache::class, ],];Stopbare gebeurtenissen
Section titled “Stopbare gebeurtenissen”use Psr\EventDispatcher\StoppableEventInterface;
final class ArticlePublishingEvent implements StoppableEventInterface{ private bool $propagationStopped = false; private ?string $rejectionReason = null;
public function __construct( public readonly Article $article ) {}
public function isPropagationStopped(): bool { return $this->propagationStopped; }
public function reject(string $reason): void { $this->propagationStopped = true; $this->rejectionReason = $reason; }
public function getRejectionReason(): ?string { return $this->rejectionReason; }}
// Listener can stop propagationfinal class ContentModerationListener{ public function __invoke(ArticlePublishingEvent $event): void { if ($this->containsProhibitedContent($event->article)) { $event->reject('Content violates community guidelines'); } }}Beste praktijken
Section titled “Beste praktijken”- Onveranderlijke gebeurtenissen - Gebeurtenissen moeten alleen-lezen zijn
- Specifieke evenementen - Creëer specifieke evenementen, geen generieke evenementen
- Async indien mogelijk - Gebruik wachtrijen voor langzame bewerkingen
- Geen bijwerkingen bij verzending - Verzending moet snel zijn
- Documentgebeurtenissen - Lijst met beschikbare gebeurtenissen voor modulegebruikers
Gerelateerde documentatie
Section titled “Gerelateerde documentatie”- Module-ontwikkeling - Module-ontwikkeling
- Event-System-Guide - PSR-14 gids
- Haken-evenementen - Legacy-haken
- Evenementen-en-haken - Voorbeelden van evenementen