事件(觸發器)
核心與各模組會在主要動作的前後觸發事件(觸發器)。第三方模組可以介入其中,在不修改核心的情況下擴充行為。
運作原理
- 大部分事件會以
before與after一組,觸發兩次。 - 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 中不要依賴回傳值。