イベント(トリガー)
コアと各モジュールは、主要な動作の前後でイベント(トリガー)を発生させます。サードパーティのモジュールはここに割り込み、コアを修正せずに動作を拡張します。
動作の仕組み
- ほとんどのイベントは
beforeとafterの1組で、2回発生します。 - before:処理の実行前。ハンドラーがエラー(BaseObject の失敗)を返すと、処理を中断させることができます。
- after:処理の完了後。戻り値は通常無視されます。後続処理(通知の送信、キャッシュの更新など)に使います。
ハンドラーの登録
module.xml に宣言し、モジュールのアップデートを実行すると登録されます。
<eventHandlers>
<eventHandler before="document.insertDocument" class="Controllers\Trigger" method="beforeInsertDocument" />
<eventHandler after="document.insertDocument" class="Controllers\Trigger" method="afterInsertDocument" />
</eventHandlers><?php
namespace Zittme\Modules\Mymodule\Controllers;
class Trigger extends Base
{
// $obj 에 대상 데이터(문서 등)가 참조로 들어옵니다
public function afterInsertDocument(&$obj)
{
try
{
// 예: 새 글 등록 시 외부 알림
}
catch (\Throwable $e)
{
// 전역 트리거에서 내 모듈 사정으로 코어를 죽이지 않는다
}
}
}主なイベント
全一覧は膨大なため、カテゴリーごとの代表的なものだけを記します。命名規則は module.action です。
リクエストのライフサイクル
| イベント | タイミング |
|---|---|
moduleHandler.init | リクエスト処理の準備 |
moduleObject.proc | アクション実行の前後 |
act:module.actionName | 特定のアクション単位で割り込む |
display | 最終出力の直前 |
文書・コメント
document.insertDocument document.updateDocument document.deleteDocument document.moveDocumentToTrash document.getDocumentList / comment.insertComment comment.updateComment comment.deleteComment など
会員
member.insertMember member.updateMember member.deleteMember member.doLogin member.doLogout member.addMemberToGroup など
ファイル・その他
file.insertFile file.deleteFile file.downloadFile / communication.sendMessage / point.setPoint / menu.getModuleListInSitemap(メニュー追加画面のモジュール一覧に自分のモジュールを載せるとき)
正確なイベントを探す方法
ドキュメントよりコードのほうが正確です。コアでイベントが発生する箇所を直接探してください。
grep -rn "triggerCall('찾을이름" modules/ classes/ModuleHandler::triggerCall('name', 'before|after', $obj) の呼び出し部分を見れば、どんなデータが $obj として渡されるかをそのまま確認できます。
作成のルール
- ハンドラーは該当するすべての動作のたびに実行されます。軽く保ち、重い処理は条件を絞ってから行ってください。
- 例外を外に投げないでください。自分のモジュールの都合で、投稿・ログインのようなコアの動作が止まってはいけません。
- エラーを返すのは before で中断させるときだけにし、after では戻り値に依存しないでください。