XOOPS sustav događaja
2.5.x: Predučitavanja 4.0.x: PSR-14
Dva sustava događaja u XOOPS
| Sustav | Verzija | Sluč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.
Pregled
Section titled “Pregled”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.
Vrste događaja
Section titled “Vrste događaja”Osnovni događaji
Section titled “Osnovni događaji”| Događaj | Točka okidanja |
|---|---|
core.header.start | Prije obrade zaglavlja |
core.header.end | Nakon obrade zaglavlja |
core.footer.start | Prije prikazivanja podnožja |
core.footer.end | Nakon renderiranja podnožja |
core.exception | Kada se dogodi iznimka |
Događaji životnog ciklusa modula
Section titled “Događaji životnog ciklusa modula”| Događaj | Točka okidanja |
|---|---|
module.install | Nakon instalacije modula |
module.update | Nakon ažuriranja modula |
module.uninstall | Prije uklanjanja modula |
module.activate | Kada je modul aktiviran |
module.deactivate | Kada je modul deaktiviran |
Korisnički događaji
Section titled “Korisnički događaji”| Događaj | Točka okidanja |
|---|---|
user.login | Nakon uspješne prijave |
user.logout | Nakon odjave |
user.register | Nakon registracije |
user.delete | Prije brisanja korisnika |
Sustav prethodnog učitavanja (naslijeđeno)
Section titled “Sustav prethodnog učitavanja (naslijeđeno)”Stvaranje predučitavanja
Section titled “Stvaranje predučitavanja”<?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 }}Imenovanje metode događaja
Section titled “Imenovanje metode događaja”event{Category}{Action}
Examples:- eventCoreHeaderStart- eventUserLogin- eventModuleNewsArticleCreatePSR-14 Dispečer događaja (XOOPS 4.0)
Section titled “PSR-14 Dispečer događaja (XOOPS 4.0)”Klasa događaja
Section titled “Klasa događaja”<?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 ) {}}Slanje događaja
Section titled “Slanje događaja”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; }}Slušatelj događaja
Section titled “Slušatelj događaja”<?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, ] ); }}Registracija slušatelja
Section titled “Registracija slušatelja”return [ ArticleCreatedEvent::class => [ SendNotificationOnArticleCreated::class, UpdateSearchIndex::class, ClearArticleCache::class, ],
ArticleUpdatedEvent::class => [ UpdateSearchIndex::class, ClearArticleCache::class, ],
ArticleDeletedEvent::class => [ RemoveFromSearchIndex::class, ClearArticleCache::class, ],];Događaji koji se mogu zaustaviti
Section titled “Događaji koji se mogu zaustaviti”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'); } }}Najbolji primjeri iz prakse
Section titled “Najbolji primjeri iz prakse”- Nepromjenjivi događaji - Događaji bi trebali biti samo za čitanje
- Specifični događaji - Stvorite specifične događaje, a ne generičke
- Async When Possible - Koristite redove za spore operacije
- Nema nuspojava u otpremi - otprema bi trebala biti brza
- Dokumentiraj događaje - Popis dostupnih događaja za korisnike modula
Povezana dokumentacija
Section titled “Povezana dokumentacija”- Razvoj modula - Razvoj modula
- Vodič za sustav događaja - PSR-14 vodič
- Udice-događaji - Naslijeđene udice
- Events-and-Hooks - Primjeri događaja