Skip to content

XOOPS sustav događaja

2.5.x: Predučitavanja 4.0.x: PSR-14

Dva sustava događaja u XOOPS

SustavVerzijaSlučaj upotrebe
Sustav predopterećenja✅ XOOPS 2.5.x (trenutačno)Priključite se na ključne događaje putem class/Preload.php
PSR-14 Dispečer događaja🚧 XOOPS 4.0 (buduće)Moderno otpremanje događaja s tipiziranim događajima

Za XOOPS 2.5.x modules koristite odjeljak Sustav predučitavanja u nastavku. Odjeljak PSR-14 je za razvoj XOOPS 4.0.

Sustav događaja XOOPS omogućuje labavu vezu između modules kroz uzorak promatrača. Komponente mogu emitirati događaje koje drugi dijelovi sustava mogu slušati i odgovoriti na njih.

DogađajTočka okidanja
core.header.startPrije obrade zaglavlja
core.header.endNakon obrade zaglavlja
core.footer.startPrije prikazivanja podnožja
core.footer.endNakon renderiranja podnožja
core.exceptionKada se dogodi iznimka
DogađajTočka okidanja
module.installNakon instalacije modula
module.updateNakon ažuriranja modula
module.uninstallPrije uklanjanja modula
module.activateKada je modul aktiviran
module.deactivateKada je modul deaktiviran
DogađajTočka okidanja
user.loginNakon uspješne prijave
user.logoutNakon odjave
user.registerNakon registracije
user.deletePrije brisanja korisnika

Sustav prethodnog učitavanja (naslijeđeno)

Section titled “Sustav prethodnog učitavanja (naslijeđeno)”
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. Nepromjenjivi događaji - Događaji bi trebali biti samo za čitanje
  2. Specifični događaji - Stvorite specifične događaje, a ne generičke
  3. Async When Possible - Koristite redove za spore operacije
  4. Nema nuspojava u otpremi - otprema bi trebala biti brza
  5. Dokumentiraj događaje - Popis dostupnih događaja za korisnike modula