コンテンツにスキップ

フックとイベント

XOOPSはコアの機能と相互作用し、直接的な依存関係なくモジュール間で相互作用するための拡張ポイントとしてフックとイベントを提供します。

側面フックイベント
目的動作/データの変更出現に対応
リターン変更されたデータを返すことができる通常はvoid
タイミングアクション前/中アクション後
パターンフィルターチェーンオブザーバー/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);
}
}

プリロードイベント リファレンス

Section titled “プリロードイベント リファレンス”
// ヘッダー/フッター
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]
);
}
}

モジュールイベントをリッスン

Section titled “モジュールイベントをリッスン”
// 別のモジュールの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. エラーを処理 - リスナーエラーがフローを中断しないようにする
  • Event-System - 詳細なイベントドキュメント
  • ../03-Module-Development/Module-Development - モジュール開発
  • ../07-XOOPS-4.0/Implementation-Guides/Event-System-Guide - PSR-14イベント