System zdarzeń XOOPS
2.5.x: Preloads 4.0.x: PSR-14
Przegląd
Dział zatytułowany „Przegląd”System zdarzeń XOOPS umożliwia luźne powiązanie między modułami poprzez wzorzec observer. Komponenty mogą emitować zdarzenia, które inne części systemu mogą słuchać i na nie reagować.
Typy zdarzeń
Dział zatytułowany „Typy zdarzeń”Zdarzenia rdzeniowe
Dział zatytułowany „Zdarzenia rdzeniowe”| Zdarzenie | Punkt wyzwolenia |
|---|---|
core.header.start | Przed przetwarzaniem nagłówka |
core.header.end | Po przetwarzaniu nagłówka |
core.footer.start | Przed renderowaniem stopki |
core.footer.end | Po renderowaniu stopki |
core.exception | Gdy pojawi się wyjątek |
Zdarzenia cyklu życia modułu
Dział zatytułowany „Zdarzenia cyklu życia modułu”| Zdarzenie | Punkt wyzwolenia |
|---|---|
module.install | Po instalacji modułu |
module.update | Po aktualizacji modułu |
module.uninstall | Przed usunięciem modułu |
module.activate | Gdy moduł jest aktywowany |
module.deactivate | Gdy moduł jest dezaktywowany |
Zdarzenia użytkownika
Dział zatytułowany „Zdarzenia użytkownika”| Zdarzenie | Punkt wyzwolenia |
|---|---|
user.login | Po pomyślnym zalogowaniu |
user.logout | Po wylogowaniu |
user.register | Po rejestracji |
user.delete | Przed usunięciem użytkownika |
System Preload (legacy)
Dział zatytułowany „System Preload (legacy)”Tworzenie Preload
Dział zatytułowany „Tworzenie Preload”<?phpnamespace XoopsModules\MyModule;
use Xmf\Module\Helper\AbstractHelper;
final class Preload extends AbstractHelper{ public function eventCoreHeaderStart(array $args): void { // Wykonaj na każdej stronie przed nagłówkiem }
public function eventCoreFooterStart(array $args): void { // Wykonaj przed renderowaniem stopki }
public function eventUserLogin(array $args): void { $userId = $args['userid']; // Obsługuj zdarzenie logowania }
public function eventCoreException(array $args): void { $exception = $args['exception']; // Zaloguj lub obsługuj wyjątek }}Nazewnictwo metod zdarzeń
Dział zatytułowany „Nazewnictwo metod zdarzeń”event{Kategoria}{Akcja}
Przykłady:- eventCoreHeaderStart- eventUserLogin- eventModuleNewsArticleCreatePSR-14 Event Dispatcher (XOOPS 4.0)
Dział zatytułowany „PSR-14 Event Dispatcher (XOOPS 4.0)”Klasa zdarzenia
Dział zatytułowany „Klasa zdarzenia”<?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 ) {}}Dyspozycja zdarzeń
Dział zatytułowany „Dyspozycja zdarzeń”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);
// Dyspozycja zdarzenia $this->dispatcher->dispatch(new ArticleCreatedEvent( articleId: $article->getId(), authorId: $article->getAuthorId(), title: $article->getTitle(), createdAt: new \DateTimeImmutable() ));
return $article; }}Nasłuchiwacz zdarzeń
Dział zatytułowany „Nasłuchiwacz zdarzeń”<?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, ] ); }}Rejestracja nasłuchiwaczy
Dział zatytułowany „Rejestracja nasłuchiwaczy”return [ ArticleCreatedEvent::class => [ SendNotificationOnArticleCreated::class, UpdateSearchIndex::class, ClearArticleCache::class, ],
ArticleUpdatedEvent::class => [ UpdateSearchIndex::class, ClearArticleCache::class, ],
ArticleDeletedEvent::class => [ RemoveFromSearchIndex::class, ClearArticleCache::class, ],];Zdarzenia zatrzymywalne
Dział zatytułowany „Zdarzenia zatrzymywalne”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; }}
// Nasłuchiwacz może zatrzymać propagacjęfinal class ContentModerationListener{ public function __invoke(ArticlePublishingEvent $event): void { if ($this->containsProhibitedContent($event->article)) { $event->reject('Content violates community guidelines'); } }}Najlepsze praktyki
Dział zatytułowany „Najlepsze praktyki”- Zdarzenia niezmienne - Zdarzenia powinny być tylko do odczytu
- Zdarzenia specyficzne - Twórz zdarzenia specyficzne, nie generyczne
- Asynchronizacja gdy to możliwe - Użyj kolejek dla wolnych operacji
- Brak efektów ubocznych w dyspozycji - Dyspozycja powinna być szybka
- Dokumentuj zdarzenia - Wypisz dostępne zdarzenia dla użytkowników modułu
Powiązana dokumentacja
Dział zatytułowany „Powiązana dokumentacja”- Module-Development - Tworzenie modułu
- Event-System-Guide - Przewodnik PSR-14
- Hooks-Events - Legacy haki
- Events-and-Hooks - Przykłady zdarzeń