דלגו לתוכן

XOOPS מערכת אירועים

2.5.x: טעינות מוקדמות 4.0.x: PSR-14

:::הערה[שתי מערכות אירועים ב-XOOPS]

מערכתגרסהמקרה שימוש
מערכת טעינה מראש✅ XOOPS 2.5.x (נוכחי)היכנס לאירועי ליבה באמצעות class/Preload.php
PSR-14 סדרן אירועים🚧 XOOPS 4.0 (עתיד)שיגור אירועים מודרני עם אירועים מודפסים

עבור XOOPS 2.5.x מודולים, השתמש בסעיף טעינה מראש למטה. החלק PSR-14 מיועד לפיתוח XOOPS 4.0. :::

מערכת האירועים 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לפני מחיקת משתמש

מערכת טעינה מראש (מדור קודם)

Section titled “מערכת טעינה מראש (מדור קודם)”
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

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,
],
];

אירועים שניתנים לעצירה

Section titled “אירועים שניתנים לעצירה”
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. אירועי מסמך - רשימת אירועים זמינים עבור משתמשי מודול