Bỏ qua để đến nội dung

Hệ thống sự kiện XOOPS

2.5.x: Tải trước 4.0.x: PSR-14

Hệ thống sự kiện XOOPS cho phép ghép nối lỏng lẻo giữa modules thông qua mẫu quan sát. Các thành phần có thể phát ra các sự kiện mà các phần khác của hệ thống có thể lắng nghe và phản hồi.

Sự kiệnĐiểm kích hoạt
core.header.startTrước khi xử lý tiêu đề
core.header.endSau khi xử lý tiêu đề
core.footer.startTrước khi hiển thị chân trang
core.footer.endSau khi hiển thị chân trang
core.exceptionKhi ngoại lệ xảy ra
Sự kiệnĐiểm kích hoạt
module.installSau khi cài đặt mô-đun
module.updateSau khi cập nhật mô-đun
module.uninstallTrước khi gỡ bỏ mô-đun
module.activateKhi mô-đun được kích hoạt
module.deactivateKhi mô-đun ngừng hoạt động
Sự kiệnĐiểm kích hoạt
user.loginSau khi đăng nhập thành công
user.logoutSau khi đăng xuất
user.registerSau khi đăng ký
user.deleteTrước khi xóa người dùng
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

Bộ điều phối sự kiện PSR-14 (XOOPS 4.0)

Phần tiêu đề “Bộ điều phối sự kiện 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. Sự kiện bất biến - Sự kiện chỉ được đọc
  2. Sự kiện cụ thể - Tạo sự kiện cụ thể, không tạo sự kiện chung chung
  3. Không đồng bộ khi có thể - Sử dụng hàng đợi cho các hoạt động chậm
  4. Không có tác dụng phụ khi gửi hàng - Việc gửi hàng phải nhanh chóng
  5. Sự kiện tài liệu - Liệt kê các sự kiện có sẵn cho người dùng mô-đun