Lewati ke konten

Sistem Acara XOOPS

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

Dua Sistem Acara di XOOPS

SistemVersiKasus Penggunaan
Sistem Pramuat✅ XOOPS 2.5.x (saat ini)Ikuti acara core melalui class/Preload.php
Pengirim Acara PSR-14🚧 XOOPS 4.0 (masa depan)Pengiriman acara modern dengan acara yang diketik

Untuk module XOOPS 2.5.x, gunakan bagian Sistem Pramuat di bawah. Bagian PSR-14 ditujukan untuk pengembangan XOOPS 4.0.

Sistem peristiwa XOOPS memungkinkan penggabungan longgar antar module melalui pola pengamat. Komponen dapat memancarkan peristiwa yang dapat didengar dan ditanggapi oleh bagian lain dari sistem.

AcaraTitik Pemicu
core.header.startSebelum pemrosesan header
core.header.endSetelah pemrosesan tajuk
core.footer.startSebelum rendering footer
core.footer.endSetelah rendering footer
core.exceptionKetika pengecualian terjadi
AcaraTitik Pemicu
module.installSetelah instalasi module
module.updateSetelah pembaruan module
module.uninstallSebelum penghapusan module
module.activateKetika module diaktifkan
module.deactivateKetika module dinonaktifkan
AcaraTitik Pemicu
user.loginSetelah berhasil login
user.logoutSetelah keluar
user.registerSetelah registrasi
user.deleteSebelum penghapusan pengguna
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. Peristiwa yang Tidak Dapat Diubah - Acara harus bersifat hanya-baca
  2. Acara Spesifik - Buat acara spesifik, bukan acara umum
  3. Async Bila Memungkinkan - Gunakan antrean untuk operasi yang lambat
  4. Tidak Ada Efek Samping dalam Pengiriman - Pengiriman harus cepat
  5. Dokumen Acara - Daftar acara yang tersedia untuk pengguna module