Skip to content

XOOPS Sistem dogodkov

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

Dva sistema dogodkov v XOOPS

SistemRazličicaPrimer uporabe
Sistem prednapetosti✅ XOOPS 2.5.x (trenutno)Priključite se na ključne dogodke prek class/Preload.php
PSR-14 Dispečer dogodkov🚧 XOOPS 4.0 (prihodnost)Sodobno razpošiljanje dogodkov s tipiziranimi dogodki

Za module XOOPS 2.5.x uporabite spodnji razdelek Preload System. Razdelek PSR-14 je namenjen razvoju XOOPS 4.0.

Sistem dogodkov XOOPS omogoča ohlapno povezavo med moduli prek vzorca opazovalca. Komponente lahko oddajajo dogodke, ki jih lahko drugi deli sistema poslušajo in se nanje odzovejo.

DogodekSprožilna točka
core.header.startPred obdelavo glave
core.header.endPo obdelavi glave
core.footer.startPred upodabljanjem noge
core.footer.endPo upodabljanju noge
core.exceptionKo pride do izjeme
DogodekSprožilna točka
module.installPo namestitvi modula
module.updatePo posodobitvi modula
module.uninstallPred odstranitvijo modula
module.activateKo je modul aktiviran
module.deactivateKo je modul deaktiviran
DogodekSprožilna točka
user.loginPo uspešni prijavi
user.logoutPo odjavi
user.registerPo registraciji
user.deletePred izbrisom uporabnika
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. Nespremenljivi dogodki - Dogodki morajo biti samo za branje
  2. Posebni dogodki - Ustvarite specifične dogodke, ne splošnih
  3. Asinhrono, kadar je to mogoče - Uporabite čakalne vrste za počasne operacije
  4. Brez stranskih učinkov pri odpremi – odprema mora biti hitra
  5. Dokumentiraj dogodke - seznam razpoložljivih dogodkov za uporabnike modula