İçeriğe geç

XOOPS Etkinlik Sistemi

2.5.x: Ön yüklemeler 4.0.x: PSR-14

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.

EtkinlikTetik Noktası
core.header.startBaşlık işlemeden önce
core.header.endBaşlık işlendikten sonra
core.footer.startAltbilgi oluşturmadan önce
core.footer.endAltbilgi oluşturma işleminden sonra
core.exceptionİstisna oluştuğunda
EtkinlikTetik Noktası
module.installmodule kurulumundan sonra
module.updatemodule güncellemesinden sonra
module.uninstallModülün çıkarılmasından önce
module.activatemodule etkinleştirildiğinde
module.deactivatemodule devre dışı bırakıldığında
EtkinlikTetik Noktası
user.loginBaşarılı oturum açtıktan sonra
user.logoutOturumu kapattıktan sonra
user.registerKayıt olduktan sonra
user.deleteKullanıcıyı silmeden önce
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. Değişmez Etkinlikler - Etkinlikler salt okunur olmalıdır
  2. Belirli Etkinlikler - Genel etkinlikler değil, belirli etkinlikler oluşturun
  3. Mümkün Olduğunda Eşzamansız - Yavaş işlemler için kuyrukları kullanın
  4. Gönderimde Yan Etki Olmaz - Gönderim hızlı olmalıdır
  5. Belge Olayları - module kullanıcıları için mevcut etkinlikleri listeleyin