CodeIgniter User Guide Version 2.1.0


컨트롤러 Controllers

컨트롤러는 여러분 프로그램의 핵심이라 할수 있습니다. 왜냐하면 Http 요청을 어떻게 처리할지 결정하기 때문입니다.

 

컨트롤러란 무엇인가?

간단하게 말하면 컨트롤러는 URL과 상호작용하는 클래스 파일이라고 할수 있습니다.

아래 URI를 보세요 :

example.com/index.php/blog/

위 예제에서 CodeIgniter 는 blog.php 라는 파일을 Controller 로서 찾은후 로드 합니다.

컨트롤러의 이름이 URI 의 첫번째 새그먼트와 동일하다면 해당 컨트롤러는 자동적으로 로드될것입니다.

따라해보세요:  Hello World!

실재로 작동되는걸 확인해보는것이 쵝오죠 ! blog.php 라는 파일을 만든후 다음의 코드를 입력하세요 .

그다음에 application/controllers/ 폴더에 저장하세요 .

자 이제 아래예 처럼 브라우저에서 접속보세요 .(example.com 부분은 여러분의 url 로 대체되어야합니다):

example.com/index.php/blog/

정상적으로 하셨다면 Hello World! 라는 텍스트가 화면에 표시되는걸 보실수 있을거예요.

Note: 클래스명은 반드시 대문자로 시작되어야합니다. 아래의 예제는 맞습니다.:

<?php
class Blog extends CI_Controller {

}
?>

그러나 아래의 예제는 틀렸습니다.

<?php
class blog extends CI_Controller {

}
?>

님하가 만드신 컨트롤러는 반드시 부모컨트롤러 로 부터 상속(extends)받아야합니다.그렇지않으면 컨트롤러의 기능을 사용할 수 없습니다.

함수 (Functions)

위 예제에서 함수이름은 index() 였습니다. "index" 함수는 URI 에서 두번째 새그먼트가 전달되지않을때 기본으로 실행됩니다. 아래와같은 방법으로도 위 예제와같이 "Hello World"를 화면에 뿌릴수 있습니다.

example.com/index.php/blog/index/

URI 의 두번째 새그먼트는 컨트롤러 내의 어떤함수가 실행될지를 결정합니다..

따라해보세요. 새로운 함수를 컨트롤러에 추가합니다.

아래 URL로 접속하여 comment 함수를 실행시켜봅시다:

example.com/index.php/blog/comments/

새로운 메세지가 보이시죠 ? 짝짝짝

URI Segments 를 함수에 전달하기

URI 가 2개보다 많은 세그먼트를 포함하고있다면 나머지들은 파라미터로 함수에 전달됩니다.

예를들어 다음의 URL 이라면:

example.com/index.php/products/shoes/sandals/123

함수는 새그먼트 3번과 4번("sandals" 및 "123")을 파라미터로 전달받게 됩니다.

<?php
class Products extends CI_Controller {

    public function shoes($sandals, $id)
    {
        echo $sandals;
        echo $id;
    }
}
?>

중요:  만약 URI 라우팅(Routing) 을 사용하고있다면, 함수에전달된 새그먼트는 재 라우팅된 새그먼트 일것입니다.

기본 Controller 정의

새그먼트 없이 사이트의 루트 url 만 요청될때 실행될 기본 컨트롤러를 지정할 수 있습니다.

기본 컨트롤러를 지정하려면application/config/routes.php 파일의 아래 변수에 세팅합니다.

$route['default_controller'] = 'Blog';

위와 같이 Blog를 기본 컨트롤러로 지정하면 루트 url 이 요청되었을때 이제는 Hello World를 보실수 있을것입니다.

함수요청을 재 매핑 하기

위에서 설명한것처럼, 일반적으로 URI 의 두번째 새그먼트는 컨트롤러내의 어떤 함수를 실행할것인가를 결정합니다. 이런 일반루틴을 재정의하여 원하는 액션으로 바꿀수 있습니다.그러려면_remap() 함수를 사용합니다.

public function _remap()
{
    // Some code here...
}

Important:  만약 컨트롤러가 _remap()함수를 포함하고이다면, URI가 어떻든간에 _remap() 함수를 호출하게될것입니다.왜냐하면 _remap()은 CI 가 정의해 놓은 일반루틴 대신 여러분 자신만의 라우팅방법으로 재정의 해버리기 때문입니다.

재정의된 함수호출(일반적으로 URI의 두번째 새그먼트)은 함수명이 _remap() 의 파라미터로 전달됩니다:

public function _remap($method)
{
    if ($method == 'some_method')
    {
        $this->$method();
    }
    else
    {
        $this->default_method();
    }
}

_remap() 메서드로 넘기는 메서드이름 외의 파라미터는 모두 옵션입니다. 이 배열은 PHP의 call_user_func_array와 결합하여, CodeIgniter의 기본동작처럼 작동합니다.

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();
}

출력데이터 조절(Processing Output)

CodeIgniter 는 최종적으로 렌더링되어 자동적으로 브라우저에 데이터를 전송해주는 출력클래스를 가지고있습니다. 뷰항목출력클래스 페이지에서 보다 자세한 정보를 보실수 있습니다. 그러나 어떤경우에는 최종적으로 데이터가 브라우저로 보내지기전에 뭔가 전처리를 해야할때도 있을것입니다. 그것은 컨트롤러에 _output() 함수를 추가하는 것으로 가능합니다.

Important:  컨트롤러가_output()라는 함수를 가지고있다면 최종데이터를 바로 전송하는것 대신 그함수가 실행될것입니다.함수의 첫번째 파라미터는 최종출력데이터를 가지고있습니다.

예제:

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

중요 : _output() 는 최종데이터를 받습니다. 최종데이터가 _output()에 전달되기전에 벤치마크 및 메모리사용 데이터는 렌더링될것이고,캐시작성이 활성 상태라면 캐시파일도 작성되며, feature 항목을 사용한다면 헤더정보도 보내질것입니다.
컨트롤러가 출력캐시를 정상적으로 보내게 하려면, _output() 메서드를 아래와 같이 사용하세요:
if ($this->output->cache_expiration > 0)
{
    $this->output->_write_cache($output);
}

그런데 이 함수를 사용한다면 페이지 실행시간 및 메모리사용상태정보는 정확하지 않을수 있습니다.왜냐하면 그러한 정보들은 당신이 _output() 에서 처리할 내용이 어떤것인지 계산에 넣고 있지 않기 때문입니다. 출력을 조절하는 다른방법은출력클래스 항목에서 찾아보세요.

Private 함수

때에따라서 함수의 공개적 접근을 허용해서는안될경우도 있을것입니다. 함수를private 으로 만들려면, 간단히 밑줄(_)을 함수이름앞에 추가해주세요.그러면 웹에서 호출할 수 없게 됩니다.

예제:

private function _utility()
{
  // some code
}

아래와 같이 접근하려해도 작동하지않을것입니다:

example.com/index.php/blog/_utility/

컨트롤러들을 하위폴더로 구성하기

대형 사이트를 만든다면 아마도 컨트롤러를 하위폴더로 구성하는것이 더 나을것입니다.

application/controllers 아래에 폴더를 만든다음 컨트롤러 클래스들을 그안에 넣으세요.

Note:  이런식으로 사용하는경우에 URI 첫번째 새그먼트는 반드시 폴더명이라야합니다.

예를들어, 여러분의 컨트롤러 위치가 아래와같다면:

application/controllers/products/shoes.php

위의 컨트롤러를 호출하기위해서는 아래와같은 URI를 사용해야합니다:

example.com/index.php/products/shoes/show/123

각각의 하위폴더는 URL 에서 하위폴더만을 호출할때를 대비하여 기본 컨트롤러를 가지고 있어야 할것입니다. 간단히 기본컨트롤러를application/config/routes.php 파일에 설정하시면 됩니다.

또한 CodeIgniter 는 URI 를URI라우팅( Routing) 기능을 이용하여 재 매핑할 수 있도록 지원하고있습니다.

클래스 생성자

컨트롤러에서 생성자를 사용하고자 한다면 생성자아래 반드시 아래의 코드가 들어있어야합니다.:

parent::__construct();

그렇지않으면 여러분이 만든 생성자가 부모 controller 의 생성자를 재정의 해버리기때문입니다.

그러므로 반드시 위와같이 부모 controller 를 수동으로 호출해 주어야합니다.

 

<?php
class Blog extends CI_Controller {

       public function __construct()
       {
            parent::__construct();
            // 생성자 코드에 기능추가
       }
}
?>

생성자는 클래스가 초기화될때 어떤 기본값들을 설정해야한다거나 어떤 프로세스를 수행해야할때 유용합니다.생성자는 리턴값이 있어서는 안됩니다.

예약된 함수명

예약어 페이지를 참고해주세요