후킹, 프레임워크 코어 익스텐션

CodeIgniter의 후킹기능은 코어파일들을 해킹하지 않고도 내부작동방식을 변경할 수 있도록 합니다. CodeIgniter가 작동하기 시작하면 동작개념도에 설명된 처리순서에 따라서 일을 처리합니다. 그러나, 당신은 특정한 순서에서 처리하는 방식을 새롭게 바꾸고 싶을수도 있습니다. 예를 들어, 당신은 컨트롤러가 로드되기전에 특정한 기능이 수행되도록 하고싶거나, 혹은 특정순서중에 당신만의 기능이 수행되도록 하고싶을 수도 있습니다.

후킹 활성화 Enabling Hooks

후킹은 글로벌로 동작하며 application/config/config.php 파일에 있는 아래 변수를 통해서 활성화 가능합니다:

$config['enable_hooks'] = TRUE;

후크 정의 Defining a Hook

후크는 application/config/hooks.php 파일에 정의되어 있습니다. 각후크는 아래의 형태로 정의됩니다:

$hook['pre_controller'] = array(
        'class'    => 'MyClass',
        'function' => 'Myfunction',
        'filename' => 'Myclass.php',
        'filepath' => 'hooks',
        'params'   => array('beer', 'wine', 'snacks')
);

Notes:

배열의 인덱스는 여러분이 사용하고자 하는 후크포인트의 이름과 연관됩니다. 위 예제의경우에 후크포인트는 pre_controller 가 됩니다. 후크포인트의 목록은 아래에 있습니다. 다음 아이템들은 당신의 연관후크배열에 반드시 정의되어야 합니다:

  • 클래스(class) 당신이 호출하고자 하는 클래스의 이름입니다. 만약 클래스 대신 순차 함수(procedural function)를 사용한다면 이 항목을 공백으로 해주세요.
  • 함수(function) 호출하고자 하는 함수의 이름입니다.
  • 파일이름(filename) 당신의 스크립트(클래스, 함수)를 정의해둔 파일이름입니다.
  • 파일경로(filepath) 파일경로(파일명을 제외한 디렉토리경로)입니다. Note: 당신의 스크립트는 반드시 application/ 폴더 안에 있어야 합니다. 파일경로는 그 폴더로부터의 상대경로로 설정됩니다. 예를 들어,당신의 스크립트가 application/hooks/ 에 있다면,파일경로는 hooks 가 됩니다. 당신의 스크립트가 application/hooks/utilities/ 에 있다면 파일경로는 ‘hooks/utilities’ 가 되며 끝부분에 슬래시(/)가 붙지않습니다.
  • 파라미터들(params) 스크립트로 전달하고자 하는파라미터. 파라미터는 옵션입니다.

PHP 버전이 5.3 이상이시면, lambda/anoymous 함수들을 후크로 사용하실 수 있습니다. 간단한 예제:

$hook['post_controller'] = function()
{
        /* do something here */
};

동일한 후크포인트에서 여러 후크 호출하기 Multiple Calls to the Same Hook

같은 후크포인트를 하나 이상의 스크립트에서 사용하고 싶다면 간단히 배열정의를 다차원으로 합니다:

$hook['pre_controller'][] = array(
        'class'    => 'MyClass',
        'function' => 'MyMethod',
        'filename' => 'Myclass.php',
        'filepath' => 'hooks',
        'params'   => array('beer', 'wine', 'snacks')
);

$hook['pre_controller'][] = array(
        'class'    => 'MyOtherClass',
        'function' => 'MyOtherMethod',
        'filename' => 'Myotherclass.php',
        'filepath' => 'hooks',
        'params'   => array('red', 'yellow', 'blue')
);

주의할 것은 대괄호([])가 각 배열 인덱스 뒤에 있다는 점입니다:

$hook['pre_controller'][]

이것을 이용하면 다양한 스크립트를 같은 후크포인트로 사용할 수 있습니다. 배열의 순서는 처리순서가 될것입니다.

후크포인트 Hook Points

다음은 가능한 후크포인트 목록입니다. The following is a list of available hook points.

  • pre_system 시스템 작동초기입니다.벤치마크와 후킹클래스들만 로드된 상태로서, 라우팅을 비롯한 어떤 다른 프로세스도 진행되지않은 상태입니다.
  • pre_controller 컨트롤러가 호출되기 직전입니다. 모든 기반클래스(base classes), 라우팅 그리고 보안점검이 완료된 상태입니다.
  • post_controller_constructor 컨트롤러가 인스턴스화 된 직후입니다.즉 사용준비가 완료된 상태가 되겠죠. 하지만, 인스턴스화 된 후 메소드들이 호출되기 직전입니다.
  • post_controller 컨트롤러가 완전히 수행된 직후입니다.
  • display_override _display() 함수를 재정의 합니다.최종적으로 브라우저에 페이지를 전송할 때 사용됩니다. 이로서 당신만의 표시 방법( display methodology)을사용할 수 있습니다. 주의 : CI 부모객체(superobject)를 $this->CI =& get_instance() 로 호출하여 사용한 후에 최종데이터 작성은 $this->CI->output->get_output() 함수를 호출하여 할 수 있습니다.
  • cache_override 출력라이브러리(Output Library) 에 있는 _display_cache() 함수 대신 당신의 스크립트를 호출할 수 있도록 해줍니다. 이로서 당신만의 캐시 표시 메커니즘(cache display mechanism)을 적용할 수 있습니다.
  • post_system최종 렌더링 페이지가 브라우저로 보내진후에 호출됩니다.