Sistem Acara XOOPS
2.5.x: Pramuat 4.0.x: PSR-14
Dua Sistem Acara di XOOPS
| Sistem | Versi | Kasus 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.
Ikhtisar
Section titled “Ikhtisar”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.
Jenis Acara
Section titled “Jenis Acara”Acara core
Section titled “Acara core”| Acara | Titik Pemicu |
|---|---|
core.header.start | Sebelum pemrosesan header |
core.header.end | Setelah pemrosesan tajuk |
core.footer.start | Sebelum rendering footer |
core.footer.end | Setelah rendering footer |
core.exception | Ketika pengecualian terjadi |
Peristiwa Daur Hidup module
Section titled “Peristiwa Daur Hidup module”| Acara | Titik Pemicu |
|---|---|
module.install | Setelah instalasi module |
module.update | Setelah pembaruan module |
module.uninstall | Sebelum penghapusan module |
module.activate | Ketika module diaktifkan |
module.deactivate | Ketika module dinonaktifkan |
Acara Pengguna
Section titled “Acara Pengguna”| Acara | Titik Pemicu |
|---|---|
user.login | Setelah berhasil login |
user.logout | Setelah keluar |
user.register | Setelah registrasi |
user.delete | Sebelum penghapusan pengguna |
Sistem Pramuat (Warisan)
Section titled “Sistem Pramuat (Warisan)”Membuat Pramuat
Section titled “Membuat Pramuat”<?phpnamespace 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 }}Penamaan Metode Peristiwa
Section titled “Penamaan Metode Peristiwa”event{Category}{Action}
Examples:- eventCoreHeaderStart- eventUserLogin- eventModuleNewsArticleCreatePSR-14 Pengirim Acara (XOOPS 4.0)
Section titled “PSR-14 Pengirim Acara (XOOPS 4.0)”Kelas Acara
Section titled “Kelas Acara”<?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 ) {}}Acara Pengiriman
Section titled “Acara Pengiriman”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; }}Pendengar Acara
Section titled “Pendengar Acara”<?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, ] ); }}Mendaftarkan Pendengar
Section titled “Mendaftarkan Pendengar”return [ ArticleCreatedEvent::class => [ SendNotificationOnArticleCreated::class, UpdateSearchIndex::class, ClearArticleCache::class, ],
ArticleUpdatedEvent::class => [ UpdateSearchIndex::class, ClearArticleCache::class, ],
ArticleDeletedEvent::class => [ RemoveFromSearchIndex::class, ClearArticleCache::class, ],];Acara yang Dapat Dihentikan
Section titled “Acara yang Dapat Dihentikan”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 propagationfinal class ContentModerationListener{ public function __invoke(ArticlePublishingEvent $event): void { if ($this->containsProhibitedContent($event->article)) { $event->reject('Content violates community guidelines'); } }}Praktik Terbaik
Section titled “Praktik Terbaik”- Peristiwa yang Tidak Dapat Diubah - Acara harus bersifat hanya-baca
- Acara Spesifik - Buat acara spesifik, bukan acara umum
- Async Bila Memungkinkan - Gunakan antrean untuk operasi yang lambat
- Tidak Ada Efek Samping dalam Pengiriman - Pengiriman harus cepat
- Dokumen Acara - Daftar acara yang tersedia untuk pengguna module
Dokumentasi Terkait
Section titled “Dokumentasi Terkait”- Pengembangan module - Pengembangan module
- Panduan Sistem Acara - Panduan PSR-14
- Acara Kait - Kait lama
- Event-and-Hooks - Contoh event