원문: http://ellislab.com/codeigniter/user-guide/tutorial/static_pages.html



제일 먼저 할 일은 정적인 페이지를 처리할 수 있도록 컨트롤러를 설정하는 일이다. 컨트롤러는 단순한 클래스로, 요청을 위임(delegate)한다. 컨트롤러는 웹 어플리케이션에서 컴포넌트를 서로 엮는 일을 담당한다.


예를 들어, 아래와 같은 요청이 있을 때

http://example.com/news/latest/10


CodeIgniter는 news 라는 이름의 컨트롤러가 있으며, news 컨트롤러에는 latest라는 이름의 메서드가 있다고 인식한다.  이 메서드는 아마 10개의 뉴스 아이템을 가져와서, 페이지에 렌더링하는 일을 한다. 일반적으로 MVC 패턴에서, 아래와 같은 형식의 URL을 볼 수 있다.

http://example.com/[controller-class]/[controller-method]/[arguments]


URL 스킴(URL Scheme)이 점점 복잡해지면, 이러한 형식을 바꿔야할 수도 있다. 하지만 지금 당장은 이 정도로도 충분하다.


application/controllers/pages.php 파일을 아래와 같이 생성하자.

<?php


class Pages extends CI_Controller {

    public function view($page = 'home') {

    }

}


?>


즉 "pages"라는 이름킈 클래스를 만들고, view라는 이름의 메서드를 만들어서 $page라는 인자를 받도록 했다. pages 클래스는 CI_Controller 클래스를 상속한다. 따라서 pages 클래스는 CI_Controller 클래스(system/core/Controller.php)에 정의된 메서드와 변수에 접근할 수 있다.


컨트롤러는 웹 어플리케이션에서 이루어지는 모든 요청에 대해 가장 중심적인 역할을 맡는다. 상당히 기술적인 CodeIgniter 토론에서 컨트롤러는 super object라고 불리기도한다. 여타의 php 클래스와 마찬가지로, 컨트롤러는 자신 신을 $this로 참조할 수 있다. $this를 통해서 라이브러리, 뷰를 로드하거나, 프레임워크에 일반적인 명령들을 실행할 수 이다.


첫 번째 메서드를 만들었으니, 이제 기본적인 페이지 템플릿을 만들 차례다. 우리는 두가지 "뷰"(페이지 템플릿)를 만들어서, 페이지 푸터(footer)와 헤더(header)로 사용하려고 한다.


application/views/templates/header.php 파일을 생성한 후, 아래의 코드를 입력하자.

<html>

<head>

    <title><?php echo $title ?> - CodeIgniter 2 Tutorial</title>

</head>

<body>

    <h1>CodeIgniter 2 Tutorial</h1>


헤더는 메인 뷰를 로드하ㅣ전에 표시하려고 하는 코드와 몇가지 heading 요소들을 포함한다. 또한 $title 변수를 출력하는데, 이 변수는 나중에 컨트롤러에 정의할 것이다. 이제 푸터를 application/views/templates/footer.php 파일에 생성하고, 아래의 코드를 입력하자

<strong>&copy; 2011</strong>

<script type="text/javascript">

if (!NREUMQ.f) {

    NREUMQ.f = function() {

        NREUMQ.push(["load", new Date().getTime()]);

        var e = document.createElement("script");

        e.type = "text/javascript";

        e.src = (("http:" === document.location.protocol) ? "http:" : "https:") + "//" + "rpm-images.newrelic.com/42/eum/rum.js";

        document.body.appendChild(e);

        if (NREUMQ.a)

            NREUMQ.a();

    };

    NREUMQ.a = window.onload;

    window.onload = NREUMQ.f;

};

NREUMQ.push(["nrfj", "beacon-3.newrelic.com", "eb488e72a1", "2281554", "NgEEZBYHDUFWVk0KWg9LJUUXEgxfGFZWB1AIAwhZEAMRHUJGXBEYBhEPVAE=", 0, 26, new Date().getTime(), "", "", "", "", ""]); 

</script></body>

</html>



컨트롤러에 로직 추가하기


앞에서 view() 메서드를 가진 컨트롤러를 생성했다. 이 메서드는 하나의 파라미터를 받으며, 이 파라미터는 로드할 페이지의 이름을 값으로 받는다. 정적인 페이지 템플릿은 application/views/pages/ 디렉토리에 위치시킨다. 이 디렉토리에 2개의 파일, home.php와 about.php를 만든다. 그리고 각 파일에 원하는 어떤 내용이든 입력한 후 저장한다. 스스로가 정말 무엇을 써야할지 모르겠다면, 간단히 "Hello World!"라고 입력한다.


이들 페이지를 로드하려면, 요청된 페이지가 실제로 존재하는지 확인해야 한다.

public function view($page = 'home') {

    if (!file_exists('application/views/pages/' . $page . '.php')) {

        // Whoops, we don't have a page for that!

        show_404();

    }


    $data['title'] = ucfirst($page);

    // Capitalize the first letter


    $this -> load -> view('templates/header', $data);

    $this -> load -> view('pages/' . $page, $data);

    $this -> load -> view('templates/footer', $data);

}


페이지가 존재한다면, 헤더와 푸터를 포함해서 페이지가 로드된 후 사용자에게 표시된다. 페이지가 존재하지 않는다면, "404 Page not found" 에러가 보여진다. 


메서드의 첫 라인에서는 페이지가 실제로 존재하는지 확인한다. PHP의 내장 함수인 file_exists()를 사용하여 해당 파일이 원하는 위치에 있는지 검사한다. show_404()는 CodeIgniter 내장 함수로, 디폴트 에러 페이지를 렌더링한다.


헤더 템플릿에서 $title 변수를 사용하여 각 페이지의 타이틀을 달리 표시하였다. $title 변수는 이 메서드에서 정의한다. 단순히 변수에 값을 할당하는 대신에, $data 배열에 title 요소를 할당하는 방식으로 사용한다.


마지막으로 뷰를 출력할 순서대로 로드한다. view() 메서드의 2번쨰 파라미터는 뷰에 값을 전달하기 위해 사용한다. $data 배열의 각 요소는 요소의 키를 변수 이름으로 가지도록 할당된다. 따라서 컨트롤러에서 $data['title']에 값을 할당한 경우, 뷰에서는 $title로 접근할 수 있다.



라우팅(Routing)


컨트롤러는 이제 제대로 동작하게 된다. 브라우저를 열어서 [사이트 url]/index.php/pages/view로 접근하여 페이지에 접근할 수 있다. 

역주). 여기에서는 $page에 해당하는 값을 요청하지 않았으므로, 디폴트 값인 'home'이 사용되어 home.php 파일이 열린다.

그리고 index.php/pages/vies/about으로 접근하면, about 페이지를 볼 수 있다. 물론 이 페이지에서 헤더와 푸터가 포함된다. 


라우팅 규칙을 커스터마이징하게 되면, URI를 원하는 컨트롤러와 메서드에 매핑할 수 있게 되며, 이를 통해 일반적인 매핑 규칙의 제약에서 벗어날 수 있다.

http://example.com/[controller-class]/[controller-method]/[arguments]


위와 같이 접근할 수 있도록 해보자. application/config/routes.php 파일을 열어서, 아래의 2 라인을 추가한다. 그리고 $route 배열에 설정된 나머지 요소를 정의하는 코드는 모두 삭제하자.

$route['default_controller'] = 'pages/view';

$route['(:any)'] = 'pages/view/$1';


CodeIgniter는 라유팅 규칙으로 정의된 규칙을 위에서 차례대로 읽어서 요청에 가장 먼저 매칭되는 규칙을 기반으로 라우팅을 적용한다. 각 규칙은 정규식으로, 컨트롤러 명 / 메서드명으로 매칭된다. 요청이 들어오면 CodeIgniter는 가장 먼저 매칭되는 규칙을 찾고, 그에 맞게 컨트롤러와 메서드를 호출하며, 알맞은 인자를 전달하게 된다.


라우팅과 관련된 더 자세한 정보는 URI Routing 문서에서 찾아볼 수 있다. 


여기에서는 $routes 배열의 두번째 규칙에서 모든 요청을 하나의 와일드 카드 문자열인 (:any)을 사용하여 매칭하도록 했다.  따라서 모든 요청은 pages 클래스의 view() 메서드로 파라미터를 전달하게 된다.


이제 index.php/about으로 접근해보자. pages 컨트롤러의 view() 멧드로 정확하게 라우팅이 되는가? 놀랍지 않은가!


Posted by socurites