XOOPS Etkinlik Sistemi
2.5.x: Ön yüklemeler 4.0.x: PSR-14
Genel Bakış
Section titled “Genel Bakış”XOOPS olay sistemi, bir gözlemci modeli aracılığıyla modules arasında gevşek bağlantıya olanak tanır. Bileşenler, sistemin diğer bölümlerinin dinleyebileceği ve yanıt verebileceği events yayabilir.
Etkinlik Türleri
Section titled “Etkinlik Türleri”Temel Etkinlikler
Section titled “Temel Etkinlikler”| Etkinlik | Tetik Noktası |
|---|---|
core.header.start | Başlık işlemeden önce |
core.header.end | Başlık işlendikten sonra |
core.footer.start | Altbilgi oluşturmadan önce |
core.footer.end | Altbilgi oluşturma işleminden sonra |
core.exception | İstisna oluştuğunda |
module Yaşam Döngüsü Olayları
Section titled “module Yaşam Döngüsü Olayları”| Etkinlik | Tetik Noktası |
|---|---|
module.install | module kurulumundan sonra |
module.update | module güncellemesinden sonra |
module.uninstall | Modülün çıkarılmasından önce |
module.activate | module etkinleştirildiğinde |
module.deactivate | module devre dışı bırakıldığında |
user Etkinlikleri
Section titled “user Etkinlikleri”| Etkinlik | Tetik Noktası |
|---|---|
user.login | Başarılı oturum açtıktan sonra |
user.logout | Oturumu kapattıktan sonra |
user.register | Kayıt olduktan sonra |
user.delete | Kullanıcıyı silmeden önce |
Ön Yükleme Sistemi (Eski)
Section titled “Ön Yükleme Sistemi (Eski)”Ön Yükleme Oluşturma
Section titled “Ön Yükleme Oluşturma”<?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 }}Olay Yöntemi Adlandırma
Section titled “Olay Yöntemi Adlandırma”event{Category}{Action}
Examples:- eventCoreHeaderStart- eventUserLogin- eventModuleNewsArticleCreatePSR-14 Olay Dağıtıcısı (XOOPS 4.0)
Section titled “PSR-14 Olay Dağıtıcısı (XOOPS 4.0)”Etkinlik Sınıfı
Section titled “Etkinlik Sınıfı”<?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 ) {}}Olayları Gönderme
Section titled “Olayları Gönderme”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; }}Etkinlik İşleyici
Section titled “Etkinlik İşleyici”<?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, ] ); }}Dinleyicileri Kaydetme
Section titled “Dinleyicileri Kaydetme”return [ ArticleCreatedEvent::class => [ SendNotificationOnArticleCreated::class, UpdateSearchIndex::class, ClearArticleCache::class, ],
ArticleUpdatedEvent::class => [ UpdateSearchIndex::class, ClearArticleCache::class, ],
ArticleDeletedEvent::class => [ RemoveFromSearchIndex::class, ClearArticleCache::class, ],];Durdurulabilir events
Section titled “Durdurulabilir events”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'); } }}En İyi Uygulamalar
Section titled “En İyi Uygulamalar”- Değişmez Etkinlikler - Etkinlikler salt okunur olmalıdır
- Belirli Etkinlikler - Genel etkinlikler değil, belirli etkinlikler oluşturun
- Mümkün Olduğunda Eşzamansız - Yavaş işlemler için kuyrukları kullanın
- Gönderimde Yan Etki Olmaz - Gönderim hızlı olmalıdır
- Belge Olayları - module kullanıcıları için mevcut etkinlikleri listeleyin
İlgili Belgeler
Section titled “İlgili Belgeler”- module-Geliştirme - module geliştirme
- Olay-Sistem-Kılavuzu - PSR-14 kılavuzu
- Hook-Events - Eski hooks
- events ve hooks - Etkinlik örnekleri