Ga naar inhoud

XOOPS-gebeurtenissysteem

2.5.x: vooraf geladen 4.0.x: PSR-14

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.

EvenementTriggerpunt
core.header.startVóór headerverwerking
core.header.endNa headerverwerking
core.footer.startVóór weergave van de voettekst
core.footer.endNa weergave van de voettekst
core.exceptionWanneer er een uitzondering optreedt
EvenementTriggerpunt
module.installNa module-installatie
module.updateNa module-update
module.uninstallVóór verwijdering van de module
module.activateWanneer module geactiveerd
module.deactivateWanneer module gedeactiveerd
EvenementTriggerpunt
user.loginNa succesvol inloggen
user.logoutNa uitloggen
user.registerNa registratie
user.deleteVoordat de gebruiker wordt verwijderd
class/Preload.php
<?php
namespace 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
}
}
event{Category}{Action}
Examples:
- eventCoreHeaderStart
- eventUserLogin
- eventModuleNewsArticleCreate
<?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
) {}
}
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;
}
}
<?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,
]
);
}
}
config/events.php
return [
ArticleCreatedEvent::class => [
SendNotificationOnArticleCreated::class,
UpdateSearchIndex::class,
ClearArticleCache::class,
],
ArticleUpdatedEvent::class => [
UpdateSearchIndex::class,
ClearArticleCache::class,
],
ArticleDeletedEvent::class => [
RemoveFromSearchIndex::class,
ClearArticleCache::class,
],
];
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 propagation
final class ContentModerationListener
{
public function __invoke(ArticlePublishingEvent $event): void
{
if ($this->containsProhibitedContent($event->article)) {
$event->reject('Content violates community guidelines');
}
}
}
  1. Onveranderlijke gebeurtenissen - Gebeurtenissen moeten alleen-lezen zijn
  2. Specifieke evenementen - Creëer specifieke evenementen, geen generieke evenementen
  3. Async indien mogelijk - Gebruik wachtrijen voor langzame bewerkingen
  4. Geen bijwerkingen bij verzending - Verzending moet snel zijn
  5. Documentgebeurtenissen - Lijst met beschikbare gebeurtenissen voor modulegebruikers