Interception
개요
플러그인 개���자��� 플러그인에서 필요한 기능을 쉽게 구현하기 위해서는 XpressEngine 코어의 동작이 실행되는 시점에 플러그인이 끼어들어 코어의 행동을 바꾸거나 추���적인 행동을 할 수 있어야 합니다.
예를 들어, 사이트에 새���운 회원이 가입할 때, 가입한 회원에��� 가입���하 메일을 보내는 기능을 플러그인으로 만들고 싶다��, 코어가 회원���입을 처리할 때, 플러그인이 끼어들어 메일 전송 코드를 실행시���야 합니다.
이러한 '끼어들��' 기능을 일반적으로
hook
또는event
라고 칭합니다. XpressEngine1에서는trigger
라는 방식을 통해 끼어들기를 제공하였습니다.
XpressEngine3에서는 '끼어들��'�� 제공하기 위하여 AOP�� 제공합니다. AOP는 Aspect oriented programming의 약어입니다.
목적
Interception의 가장 큰 목적은 자유���운 코어 동작의 변경을 가능하도��� 하��� 위해서 입니다. 끼어들기의 타���이 되는 코드에서event
나 trigger
�� 수동으로 발생(fire)시키지 않아도 자유롭게 끼어들기��� 가능합니다.
사용법
기본적인 사용법을 예를 들어 설명하���습니다. 위의 예와 같이 코어가 회원���입을 처리할 때, 메일 전송 코드��� 실행되도��� 하기 위하여 intercept()
함수를 사용할 수 있습니다.
// 가입 축하 메일 보내�� 등록
intercept('Member@create', 'welcome_mail::send_mail', function($createMember, array $data) use ($mailer) {
// 회원���입 코드를 실행
$member = $createMember($data);
// 메일 전송
$mailer->sendWelcomeMail($member->email, $member->getDisplayName);
// 회원���입 처리 결과 반환
return $member;
});
intercept
함수의 원형은 아래와 같습니다.
intercept($pointCut, $name, Closure $advice)
파라메터
첫���째 파라메터 첫���째 파라메터인 포인트��(pointcut)은 '끼어들��'�� 할 대상 메소드를 칭합니다. 위의 예에서
Member@create
에 해당합니다. 사용가능한 포인트컷의 목���은 링크�� 참조하세요.두���째 파라메터 AOP에서 '끼어들��'�� 하는 주체�� 어드���이저(Advisor)라고 합니다. 두���째 파라메터인 $name은 이 어드���이저의 '이름'을 칭합니다. 이 이름은 서��� 중복되��� 않아야 합니다. 해당 플러그인의 아이디(디렉토리명)�� 이름의 접두사로 사용하십시오. 위의 예에서는
welcome_mail::send_mail
에 해당하며,welcome_mail
이 플러그인 아이디에 해당합니다.::
을 사용하여 접두사�� 연결하십시오.세번째 파라메터 세번째 파라메터인 $advice는 '끼어들��'�� 한 후 실행될 코드입니다. 클로저��� 제공되어야 합니다. 이 클로저는 '끼어들��'�� 할 대상���드를 감싸고 있습니다.(데코레이터 패턴) 이 클로저의 내부에서는 항상 대상���드(이 클로저의 첫���째 파라메터)�� 호출해주어야 하며, 대상���드를 호출하기 전이나 후에 원하는 코드를 추���하여 실행시킬 수 있습니다. 위의 예에서는 회원���입 처리�� 한 후에 해당 회원에��� 메일을 전송하는 코드��� 추���되어 있습니다.
이 클로저의 첫���째 파라메터는 대상 메소드입니다. 위의 예에서
$createMember
가 이에 해당합니다. 클로저 내부에서 항상 이 대상 메소드를 호출해주어야 하며, 클로저는 대상 메소드의 리턴값을 다시 리턴해야 합니다. 물��� 리턴값을 변경해도 됩니다.두���째 파라메터부터는 대상 메소드��� 호출될 때 받은 파라메터�� 그대��� 전달받습니다. 위의 예에서는
$data
에 해당하며, 가입할 회원의 정보가 담겨있습니다. 물��� 대상 메소드에 따라 파라메터의 수와 내용이 달라집니다.// 항상 대상���소드(첫���째 파라메터)�� 호출해주어야 한다. $member = $createMember($data); // 항상 대상���드의 반환���을 다시 반환해야 한다. return $member;
API
- 보다 자세한 사용법은 API 문서를 참���하시기 바랍니다. API 문서