跳到內容

掛鉤和事件

XOOPS 提供掛鉤和事件作為擴展點,允許模組與核心功能和彼此互動,無需直接依賴。

方面掛鉤事件
目的修改行為/資料對發生的事物做出反應
返回可以返回修改的資料通常為空
時機動作前/期間動作後
模式篩選器鏈觀察者/pub-sub
// 在 xoops_version.php 中登錄掛鉤
$modversion['hooks'][] = [
'name' => 'user.profile.display',
'callback' => 'mymodule_hook_user_profile',
'priority' => 10,
];
include/hooks.php
function mymodule_hook_user_profile(array $data): array
{
$userId = $data['user_id'];
// 新增自訂設定檔欄位
$data['fields']['reputation'] = mymodule_get_user_reputation($userId);
$data['fields']['badges'] = mymodule_get_user_badges($userId);
return $data;
}
掛鉤名稱資料描述
user.profile.display使用者資料陣列修改設定檔顯示
content.render內容 HTML篩選內容輸出
form.submit表單資料驗證/修改表單資料
search.results結果陣列篩選搜尋結果
menu.main功能表項目修改主功能表
// 在模組程式碼中
$eventHandler = xoops_getHandler('event');
$eventHandler->trigger('mymodule.article.created', [
'article_id' => $article->id(),
'author_id' => $article->authorId(),
'title' => $article->title(),
]);
class/Preload.php
class MyModulePreload extends \Xmf\Module\Helper\AbstractHelper
{
public function eventMymoduleArticleCreated(array $args): void
{
$articleId = $args['article_id'];
// 通知訂閱者
$this->notifyNewArticle($articleId);
}
public function eventUserLogin(array $args): void
{
$userId = $args['userid'];
// 更新模組的最後登錄
$this->updateUserActivity($userId);
}
}
// 頁首/頁尾
public function eventCoreHeaderStart(array $args): void {}
public function eventCoreHeaderEnd(array $args): void {}
public function eventCoreFooterStart(array $args): void {}
public function eventCoreFooterEnd(array $args): void {}
// 包含
public function eventCoreIncludeCommonStart(array $args): void {}
public function eventCoreIncludeCommonEnd(array $args): void {}
// 異常
public function eventCoreException(array $args): void {}
public function eventUserLogin(array $args): void {}
public function eventUserLogout(array $args): void {}
public function eventUserRegister(array $args): void {}
public function eventUserActivate(array $args): void {}
public function eventUserDelete(array $args): void {}
public function eventSystemModuleInstall(array $args): void {}
public function eventSystemModuleUninstall(array $args): void {}
public function eventSystemModuleUpdate(array $args): void {}
public function eventSystemModuleActivate(array $args): void {}
public function eventSystemModuleDeactivate(array $args): void {}
// 定義事件常數
class ArticleEvents
{
public const CREATED = 'mymodule.article.created';
public const UPDATED = 'mymodule.article.updated';
public const DELETED = 'mymodule.article.deleted';
public const PUBLISHED = 'mymodule.article.published';
}
class ArticleService
{
public function publish(Article $article): void
{
$article->publish();
$this->repository->save($article);
// 觸發事件
$GLOBALS['xoopsPreload']->triggerEvent(
ArticleEvents::PUBLISHED,
['article' => $article]
);
}
}
// 在另一個模組的 Preload.php 中
public function eventMymoduleArticlePublished(array $args): void
{
$article = $args['article'];
// 索引用於搜尋
$this->searchIndexer->index($article);
// 更新網站地圖
$this->sitemapGenerator->addUrl($article->url());
}
  1. 使用特定名稱 - module.entity.action 格式
  2. 傳遞最少資料 - 只傳遞偵聽器需要的資料
  3. 記錄事件 - 在模組文檔中列出事件
  4. 避免副作用 - 保持偵聽器集中
  5. 處理錯誤 - 不要讓偵聽器錯誤破壞流程
  • 事件系統 - 詳細的事件文檔
  • ../03-Module-Development/Module-Development - 模組開發
  • ../07-XOOPS-4.0/Implementation-Guides/Event-System-Guide - PSR-14 事件