تخطَّ إلى المحتوى

نظام الأحداث في XOOPS

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

يمكّن نظام الأحداث في XOOPS من الفصل الضعيف بين المودولات من خلال نمط المراقب. يمكن للمكونات إصدار أحداث يمكن لأجزاء أخرى من النظام الاستماع إليها والاستجابة لها.

الحدثنقطة التشغيل
core.header.startقبل معالجة الرأس
core.header.endبعد معالجة الرأس
core.footer.startقبل عرض التذييل
core.footer.endبعد عرض التذييل
core.exceptionعند حدوث استثناء

أحداث دورة حياة المودول

Section titled “أحداث دورة حياة المودول”
الحدثنقطة التشغيل
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}
أمثلة:
- eventCoreHeaderStart
- eventUserLogin
- eventModuleNewsArticleCreate

موزع الأحداث PSR-14 (XOOPS 4.0)

Section titled “موزع الأحداث PSR-14 (XOOPS 4.0)”
<?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. غير متزامن عند الإمكان - استخدم الطوابير للعمليات البطيئة
  4. لا توجد تأثيرات جانبية في التوزيع - يجب أن يكون التوزيع سريعاً
  5. توثيق الأحداث - اذكر الأحداث المتاحة لمستخدمي المودول