원문: 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

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




이 튜토리얼 문서에서는 CodeIgniter 프레임워크를 소개하고, MVC 아키텍처의 기본 개념을 소개한다. 또한 차례대로 따라하면서 기본적인 CodeIgniter 어플리케이션을 개발하는 방법을 설명한다.


이 튜토리얼을 통해서 기본적인 뉴스 어플리케이션을 개발하고자 한다. 먼저 정적인 페이지를 로드할 수 있는 코드를 작성할 것이다. 그런 후에, 데이터베이스로부터 뉴스 아이템을 읽어서 뉴스 섹션을 생성할 것 이다. 마지막으로 데이터베이스에 새로운 뉴스 아이템을 생성할 수 있는 폼(form)을 추가할 것이다.


이 튜토리얼에서는 아래의 내용을 중점적으로 다룬다.

  • Model-View-Controller 클래스
  • 라우팅 소개
  • 폼 검증
  • "Active Record"를 사용하여 기본적인 데이터베이스 쿼리 실행하기


이 튜토리얼은 여러 페이지로 구분하였으며, 각 페이지마다 CodeIgniter 프레임워크의 기능들의 각 요소를 설명한다. 아래의 페이지들을 차례차례 살펴볼 수 있다.

  • 소개
    바로 이 페이지며, 튜토리얼에서 설명할 개략적인 내용을 포함한다.
  • 정적인 페이지
    컨트롤러, 뷰, 라우팅에 대한 기본적인 개념을 설명한다.
  • 뉴스 섹션
    모델을 처음으로 사용하게 되며, 기본적인 데이터베이스와 작업하는 사용법을 익힐 수 있다.
  • 뉴스 아이템 생성하기
    좀더 고급적인 데이터베이스 작업들을 소개하며, 폼 검증 또한 익힐 수 있다.
  • 결론
    추가적인 설명과 자료들에 대한 링크를 담고 있다.

CodeIgniter 프레임워크를 탐험하는 경험을 즐기기를 바란다.



Posted by socurites

아래는 http://www.cikorea.net/user_guide_2.1.0/overview/appflow.html 에서 설명하는 CodeIgniter의 플로우 차트다.


I 동작 개념도 Application Flow Chart

아래 그림은 CI 사용시 데이터의 흐름을 보여줍니다(화살표를 따라가면서 설명을 읽어보세요):

CodeIgniter application flow
  1. The index.php 는 프론트콘트롤러(front controller)로 동작하여 CI가 동작하기 위한 기반리소스들을 초기화 합니다.
  2. 라우터모듈(Routing)은 http 요청을 분석하여 어떤 동작을 해야할지를 결정합니다.
  3. 캐쉬파일이 있다면 그파일을 바로 브라우저로 보내고 일반적인 동작절차는 무시합니다.
  4. 보안모듈(Security)은 프로그램 컨트롤러가 로딩 되기전에 HTTP 요청및 어떤 사용자 전송데이터든지 모두 필터링합니다.
  5. 컨트롤러(Application controller)는 사용자 요청을 처리하기 위해 모델을 로드하고,코어라이브러리,헬퍼 및 필요한 다른 리소스들을 로드 합니다.
  6. 최종적으로 뷰모듈(View)이 렌더링되어 브라우저로 전송됩니다. 캐싱이 활성화 되어이다면 먼저 캐쉬(Cashing)하여 다음번 요청에 사용할 수 있도록 합니다.


Posted by socurites