Package

Interception

by XEJapan posted Nov 22, 2015
?

Shortcut

PrevPrev Article

NextNext Article

ESCClose

Larger Font Smaller Font Up Down Go comment Print

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 문서