이벤트 (트리거)
코어와 각 모듈은 주요 동작의 앞뒤에서 이벤트(트리거)를 발생시킵니다. 서드파티 모듈은 여기 끼어들어 코어를 고치지 않고 동작을 확장합니다.
동작 원리
- 대부분의 이벤트는
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)
{
// 전역 트리거에서 내 모듈 사정으로 코어를 죽이지 않는다
}
}
}주요 이벤트
전체 목록은 방대하므로 범주별 대표만 적습니다. 이름 규칙은 모듈.동작 입니다.
요청 수명주기
| 이벤트 | 시점 |
|---|---|
moduleHandler.init | 요청 처리 준비 |
moduleObject.proc | 액션 실행 전후 |
act:모듈.액션명 | 특정 액션 단위로 끼어들기 |
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('이름', 'before|after', $obj) 호출부를 보면 어떤 데이터가 $obj 로 전달되는지 그대로 확인할 수 있습니다.
작성 수칙
- 핸들러는 모든 해당 동작마다 실행됩니다. 가볍게 유지하고, 무거운 일은 조건을 좁힌 뒤에 하세요.
- 예외를 밖으로 던지지 마세요. 내 모듈의 사정으로 글쓰기·로그인 같은 코어 동작이 죽으면 안 됩니다.
- before에서 중단시킬 때만 오류를 반환하고, after에서는 반환값에 의존하지 마세요.