트리거 등록시 모듈명. 이 없는 display 같은 경우
CMS/프레임워크 | Rhymix 2.0 |
---|---|
개발 언어 | PHP 7.2 |
member.insertMember
위와 같이 모듈명이 명시된 경우 명시된 모듈에서 제공하는 트리거호출 시점에 내가 만든 함수가 작동되도록 하겠다라는 의미로 해석이 됩니다.
그런데 모듈명이 없는
display 와 같은 경우가 등장합니다.
이해를 해보려고 검색을 하는 과정에서 발견한 문서가
https://xetown.com/tips/1556223
위 문서인데 여기에 설명에서
\DisplayHandler->printContent()
의 부분이라고 되어 있던데요.
저 함수에서 전,후 트리거가 실행이 된다는 것인거죠??
실제로 저 함수를 찾아보니
/classes/display/DisplayHandler.class.php
public function printContent(&$oModule)
이 부분이고 여기 함수 내
// call a trigger before display
ModuleHandler::triggerCall('display', 'before', $output);
// call a trigger after display
self::$response_size = $this->content_size = strlen($output);
ModuleHandler::triggerCall('display', 'after', $output);
부분이 등장하네요.
특정 모듈인 경우 해당모듈명.트리거명
그렇지 않은 경우 트리겨명
이렇게 된건로 보이는데 맞겠죠??
그럼 특정모듈이 아닌 곳에서 제공되는 트리거는 제가 위에 언급한 문서에 등장하는
moduleHandler.init - before
moduleHandler.init - after
moduleObject.proc - before
moduleObject.proc - after
layout - before
display - before
display - after
7가지 케이스가 전부인가요?
댓글 6
이름은 트리거와 아무 관련 없습니다. 마음만 먹으면 'asdfasdf1234' 같은 트리거명도 사용 가능합니다.
다만 일부 케이스 제외 그렇게 하지 않는 이유는 모듈명을 붙이지 않는 경우 충돌이 생길수 있기 때문입니다.(덤으로 혼동이 생길 우려도 있습니다) 예를 들어 복권 모듈에서 lotto 트리거명을 사용했는데 댓글 랜덤추첨 모듈에서도 같은 트리거명을 사용한다면 복권 정보를 받는 자료가 갑자기 댓글 정보를 받게 되는 일이 생길수 있는 것입니다.
참고로 트리거 동작 순서는 다음과 같습니다.
자료에서 triggerCall로 특정 이름의 트리거 호출 -> 서드파티 자료에서 insertTrigger로 등록한 함수 순차 호출 -> 특성에 따라 반환값 확인후 진행 중단 혹은 계속
각각 자기 모듈명을 붙여서 정한다면 겹치지 않을테니까요.
그런데 제가 처음 display 를 보고 앞에 왜 아무것도 없지? 라는 궁금증을 가졌던 것이 시간이 오래 흘러서 지금 시점에서는 이해가 가기 시작했는데요.
코어에서 제공하는 트리거 중 이와 비슷한 케이스가 위 7가지 외에 더 있는지도 궁금하네요.
전체를 검색해보면 되겠군요. 말씀 하신대로 검색을 해보니
줄 79: ModuleHandler::triggerCall('layout', 'before', $oModule);
줄 85: ModuleHandler::triggerCall('display', 'before', $output);
줄 151: ModuleHandler::triggerCall('display', 'after', $output);
줄 104: self::triggerCall('moduleHandler.init', 'before', $this);
줄 286: $output = self::triggerCall('moduleHandler.init', 'after', $this->module_info);
줄 962: $output = self::triggerCall('moduleHandler.proc', 'after', $oModule);
줄 619: $triggerOutput = ModuleHandler::triggerCall('moduleObject.proc', 'before', $this);
줄 718: $triggerOutput = ModuleHandler::triggerCall('moduleObject.proc', 'after', $this);
줄 573: $output = \ModuleHandler::triggerCall('mail.send', 'before', $this);
줄 590: $output = \ModuleHandler::triggerCall('mail.send', 'after', $this);
줄 280: $output = \ModuleHandler::triggerCall('push.send', 'before', $this);
줄 325: $output = \ModuleHandler::triggerCall('push.send', 'after', $this);
줄 517: $output = \ModuleHandler::triggerCall('sms.send', 'before', $this);
줄 556: $output = \ModuleHandler::triggerCall('sms.send', 'after', $this);
총 14개 정도 나오는거 같네요.
그동안 트리거 용법이나 작동에 관해 이해가 부족했는데 오늘로서 대략 용법과 작동하는 원리 등이 이해가 가는 것 같습니다.
모듈을 만들어보기 위한 첫 걸림돌이 제거가 된거 같은 의미가 있는 날이네요.
자세한 설명 감사했습니다.
모듈명.액션명으로 사용하는 것이 일반적인 관례이지만, 모듈이 아닌 코어에서 직접 호출하는 트리거는 이 규칙을 따를 수 없기 때문에 상황에 따라 적당히 만들어 씁니다.
그래도 웬만하면 moduleHandler.init, moduleHandler.proc, sms.send처럼 클래스명.함수명으로 합니다. display는 XE에서 이상하게 만들어 놓은 건데 이제 와서 바꿀 수도 없으니...
그런데 시간이 조금 더 지나서 다시 살펴보니 눈치가 없었구나 하면서 보이기 시작합니다.
아마 이런 황당한 질문과 같은 문서들이 보인다면 php 라이믹스에 아직 많이 알지 못하는 사람들도 대략 이해할 수 있는 문서가 될 수 있을 것 같습니다.
네이밍 규칙 이었을 뿐이라고 알고나서 보니 용법 자체가 명확하고 사용법 등이 이해가 가네요.