Salta ai contenuti

Sistema di eventi di XOOPS

2.5.x: Preloads 4.0.x: PSR-14

Il sistema di eventi di XOOPS abilita l’accoppiamento debole tra i moduli attraverso un pattern observer. I componenti possono emettere eventi che altre parti del sistema possono ascoltare e a cui rispondere.

EventoPunto di attivazione
core.header.startPrima dell’elaborazione dell’header
core.header.endDopo l’elaborazione dell’header
core.footer.startPrima del rendering del footer
core.footer.endDopo il rendering del footer
core.exceptionQuando si verifica un’eccezione
EventoPunto di attivazione
module.installDopo l’installazione del modulo
module.updateDopo l’aggiornamento del modulo
module.uninstallPrima della rimozione del modulo
module.activateQuando il modulo è attivato
module.deactivateQuando il modulo è disattivato
EventoPunto di attivazione
user.loginDopo l’accesso riuscito
user.logoutDopo il logout
user.registerDopo la registrazione
user.deletePrima dell’eliminazione dell’utente
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}
Esempi:
- 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. Eventi immutabili - Gli eventi dovrebbero essere di sola lettura
  2. Eventi specifici - Crea eventi specifici, non generici
  3. Asincronia se possibile - Usa code per operazioni lente
  4. Nessun effetto collaterale nel dispatch - Il dispatch dovrebbe essere veloce
  5. Documenta gli eventi - Elenca gli eventi disponibili per gli utenti del modulo