개발자 가이드

이벤트 (트리거)

코어와 각 모듈은 주요 동작의 앞뒤에서 이벤트(트리거)를 발생시킵니다. 서드파티 모듈은 여기 끼어들어 코어를 고치지 않고 동작을 확장합니다.

동작 원리

  • 대부분의 이벤트는 beforeafter 한 쌍으로 두 번 발생합니다.
  • 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에서는 반환값에 의존하지 마세요.