Programming/CodeIgniter

Controllers (2/2)

손가락귀신 2011. 11. 11. 01:29

1. 함수 호출 재매핑(Remapping Function Calls)

위 예제에서 URI의 두번째 세그먼트는 호출될 controller의 함수라고 하였습니다.
하지만 _remap() 함수를 사용하여 오버라이드를 할 수 있습니다.
controller에 _remap() 함수가 있다면, 항상 호출되어 사용자가 작성한 라우팅 규칙대로 실행될 것입니다.
URI의 두번째 세그먼트(함수명)부터는 _remap() 함수의 매개변수로 전달될 것입니다.

public function _remap($method, $params = array())
{
    $method = 'process_'.$method;
    if (method_exists($this, $method))
    {
        return call_user_func_array(array($this, $method), $params);
    }
    show_404();
}

위 예제에서 배열로 전달된 매개변수들은 재정의된 함수로 전달될 것입니다.


2. 출력 처리(Processing Output)

웹브라우저로 마지막 렌더링된 데이터를 출력하는 view 와 output class가 있습니다.
마지막 데이터가 웹브라우저로 보내지기 전에 처리를 해야 할 것이 있다면 controller에 _output() 함수를 추가합니다.
controller에 _output() 함수가 있다면 마지막 데이터가 보여지기 전에 항상 호출될 것입니다.

public function _output($output)
{
    echo $output;
}

_output() 함수는 마지막 상태의 데이터를 받게 되므로, 벤치마크와 메모리 사용 데이터, 캐시파일 작성등은 _output() 함수를 사용하기 전 상태입니다.
controller의 output이 정확하게 캐시된 것을 확인하려면 output의 메소드들을 이용할 수 있습니다.

if ($this->output->cache_expiration > 0)
{
    $this->output->_write_cache($output);
}

_output 함수는 페이지 실행시간 및 메모리 사용 상태 정보가 정확하지 않을 수 있습니다.


3. 하위 디렉토리의 controllers 구조

큰 어플리케이션을 개발할 때는 controller를 하위 디렉토리로 구분하는 것이 편리합니다.
간단하게 application/controllers 디렉토리 밑으로 나열하면 됩니다.

application/controllers/products/shoes.php
mydomain.com/index.php/products/shoes/show/123

서브 디렉토리 각각 index 같은 기본적으로 불려질 controller를 application/config/routes.php 파일에서 설정해야 합니다.


4. 클래스 생성자

controller 에서 생성자를 사용할 때는 생성자가 부모 controller 클래스의 생성자를 오버라이딩하기 때문에 반드시 아래처럼 코드를 입력해야 합니다.

parent::__construct();

생성자는 클래스가 초기화될 때 기본값을 설정하거나, 기본 프로세스를 수행해야 할 때 유용합니다.
생성자는 값을 반환할 수 없습니다.

<?php
class Blog extends CI_Controller {

       public function __construct()
       {
            parent::__construct();
            // Your own constructor code
       }
}
?>