Μετάβαση στο περιεχόμενο

XOOPS Σύστημα εκδηλώσεων

2.5.x: Προφορτώσεις 4.0.x: PSR-14

Το σύστημα συμβάντων XOOPS επιτρέπει τη χαλαρή σύζευξη μεταξύ των μονάδων μέσω ενός σχεδίου παρατηρητή. Τα στοιχεία μπορούν να εκπέμπουν συμβάντα στα οποία μπορούν να ακούσουν και να ανταποκριθούν άλλα μέρη του συστήματος.

ΕκδήλωσηΣημείο ενεργοποίησης
core.header.startΠριν από την επεξεργασία της κεφαλίδας
core.header.endΜετά την επεξεργασία της κεφαλίδας
core.footer.startΠριν από την απόδοση του υποσέλιδου
core.footer.endΜετά την απόδοση του υποσέλιδου
core.exceptionΌταν συμβαίνει εξαίρεση
ΕκδήλωσηΣημείο ενεργοποίησης
module.installΜετά την εγκατάσταση της μονάδας
module.updateΜετά την ενημέρωση της ενότητας
module.uninstallΠριν την αφαίρεση της μονάδας
module.activateΌταν ενεργοποιηθεί η μονάδα
module.deactivateΌταν η μονάδα είναι απενεργοποιημένη
ΕκδήλωσηΣημείο ενεργοποίησης
user.loginΜετά την επιτυχή σύνδεση
user.logoutΜετά την αποσύνδεση
user.registerΜετά την εγγραφή
user.deleteΠριν από τη διαγραφή χρήστη
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. Αμετάβλητα συμβάντα - Τα συμβάντα πρέπει να είναι μόνο για ανάγνωση
  2. Συγκεκριμένα συμβάντα - Δημιουργήστε συγκεκριμένα συμβάντα, όχι γενικά
  3. Async When Possible - Χρησιμοποιήστε ουρές για αργές λειτουργίες
  4. Χωρίς παρενέργειες στην αποστολή - Η αποστολή πρέπει να είναι γρήγορη
  5. Συμβάντα εγγράφου - Καταχωρίστε τα διαθέσιμα συμβάντα για χρήστες της ενότητας