정적 페이지(Static pages)

Note

이 튜터리얼은 CodeIgniter를 다운로드하고 개발 환경에 프레임워크를 설치 했다고 가정합니다.

가장 먼저 할 일은 정적 페이지를 처리​​할 controller를 설정하는 것입니다. 컨트롤러는 웹 어플리케이션의 접착제 역활을 하며, 작업 위임을 돕는 클래스입니다.

첫 번째 컨트롤러 만들기

app/Controllers/Pages.php 파일을 만들고 다음 코드를 입력합니다.

<?php

namespace App\Controllers;

class Pages extends BaseController
{
    public function index()
    {
        return view('welcome_message');
    }

    public function view($page = 'home')
    {
        // ...
    }
}

우리는 $Page라는 하나의 인수(argument)를 허용하는 view() 메소드가 있는 Pages 클래스를 작성했습니다. 그리고 기본 컨트롤러인 app/Controllers/Home.php와 동일한 index() 메소드(method)를 가지고 있습니다. 이 메소드는 CodeIgniter의 welcome 페이지를 보여줍니다.

Note

이 튜토리얼에서 언급되는 두 개의 view() 함수가 있습니다. 하나는 뷰를 표시하기 위한 return view('welcome_message')public function view($page = 'home')로 생성된 클래스 메소드입니다. 둘 다 기술적으로는 함수입니다. 그러나 클래스에서 함수를 만들면 메서드라고 부릅니다.

Pages 클래스는 BaseController 클래스를 확장하고 있습니다. 이는 새 Pages 클래스가 CodeIgniter\Controller 클래스에 정의된 메소드와 속성을 이용할 수 있다는 것을 의미합니다.

컨트트롤러는 웹 어플리케이션에 대한 모든 요청의 중심이 될 것입니다. 여느 php 클래스와 마찬가지로 컨트롤러내에서 $this라고 지칭합니다.

첫 번째 메소드를 만들었으니, 이제 몇 가지 기본적인 페이지 템플릿을 만들어 봅시다. 우리는 페이지 푸터(footer)와 헤더(header) 역할을 하는 두 개의 “뷰(view)”를 만들겁니다.

app/Views/templates/header.php를 생성하고 다음 코드를 추가하십시오.

<!doctype html>
<html>
<head>
    <title>CodeIgniter Tutorial</title>
</head>
<body>

    <h1><?= esc($title) ?></h1>

헤더에는 머리글과 함께 기본 보기를 로드하기 전에 표시할 기본 HTML 코드가 포함되어 있습니다. 그리고 우리가 나중에 컨트롤러에서 정의할 $title 변수를 출력합니다.

이제, 다음 코드를 포함하는 app/Views/templates/footer.php로 푸터(footer)를 작성하십시오.

    <em>&copy; 2021</em>
</body>
</html>

Note

header.php 템플릿을 자세히 보면 esc() 함수를 사용하고 있습니다. XSS 공격을 방지하기 위해 CodeIgniter에서 제공하는 글로벌 기능입니다. 자세한 내용은 여기를 참조하십시오.

컨트롤러에 로직 추가

앞서 우리는 view() 메소드를 컨트롤러에 추가했다. 이 메소드는 $Page라는 하나의 파라미터를 허용합니다. 정적(static) 페이지 본문은 app/Views/pages/ 디렉터리에 위치합니다.

그 디렉터리에 home.phpabout.php이라는 이름의 파일을 두 개를 만드십시오. 그 파일들 안에, 텍스트 − 당신이 원하는 어떤것 −를 입력하고 저장합니다. 만약 여러분이 특별히 독창적이지 않은 사람이 되고 싶다면, “Hello World!”를 입력해도 됩니다.

이 페이지를 로드하려면 요청된 페이지가 실제로 존재하는지 확인해야 합니다. 다음 내용은 위에서 만들어진 Pages컨트롤러 view() 메소드의 본문이 됩니다.

<?php

namespace App\Controllers;

class Pages extends BaseController
{
    public function view($page = 'home')
    {
        if (! is_file(APPPATH . 'Views/pages/' . $page . '.php')) {
            // Whoops, we don't have a page for that!
            throw new \CodeIgniter\Exceptions\PageNotFoundException($page);
        }

        $data['title'] = ucfirst($page); // Capitalize the first letter

        return view('templates/header', $data)
            . view('pages/' . $page)
            . view('templates/footer');
    }
}

이제 요청된 페이지가 존재하면 헤더와 푸터를 포함하여 본문이 로드되어 사용자에게 표시됩니다. 요청된 페이지가 존재하지 않을 경우, “404 Page not found” 오류가 표시됩니다.

이 메소드의 첫 번째 줄은 페이지가 실제로 존재하는지 여부를 확인합니다. PHP의 네이티브 함수 is_file()는 파일이 예상되는 위치에 있는지 확인하는 데 사용되었습니다. PageNotFoundException은 기본 오류 페이지를 표시하는 CodeIgniter 예외입니다.

헤더 템플릿에서는 페이지 제목을 출력하기 위해 “$title” 변수가 사용되었습니다. $title의 값은 메소드에서 정의되지만, 변수에 직접 값을 할당하는 대신 $data 배열의 title 요소에 할당합니다.

마지막으로 해야 할 일은 뷰(view)를 표시되는 순서대로 로드하는 것입니다. 이를 위해 CodeIgniter에 내장된 view() 함수를 사용합니다. view() 함수의 두 번째 매개변수는 뷰에 값을 전달하는 데 사용됩니다. $data 배열의 값은 변수명을 키(key)로하여 할당됩니다. 컨트롤러의 $data['title'] 값은 뷰의 $title과 동일합니다.

Note

view() 함수에 전달되는 모든 파일과 디렉터리 이름은 반드시 실제 디렉터리와 파일과 일치해야 하며 그렇지 않은 경우 대소문자를 구분하는 시스템에서 오류를 발생시킬 것입니다. 여기에서 더 많은 정보를 읽어보세요.

라우팅

컨트롤러를 만들었습니다. 다음은 라우팅 규칙을 설정하는 것입니다. 라우팅은 URI를 컨트롤러의 메서드와 연결합니다.

해볼까요? 라우팅 파일 app/Config/Routes.php를 열고 “Route Definitions” 섹션을 찾으세요.

주석 처리되지 않은 유일한 줄은

<?php

// ...

// We get a performance increase by specifying the default
// route since we don't have to scan directories.
$routes->get('/', 'Home::index');

// ...

이 지시문은 지정되지 않은 요청에 대해 Home 컨트롤러 내의 index() 메소드로 처리하라고 합니다.

‘/’에 대한 경로 지시문 뒤에 다음 행을 추가하십시오.

$routes->get('pages', 'Pages::index');
$routes->get('(:segment)', 'Pages::view/$1');

CodeIgniter는 라우팅 규칙을 위에서 아래로 읽고 요청과 첫 번째로 일치하는 규칙으로 라우팅합니다. 각 규칙은 오른쪽의 슬래시로 구분된 컨트롤러와 메소드 이름에 매핑 된 왼쪽의 정규식입니다. 요청이 들어 오면 CodeIgniter는 첫 번째 일치 항목을 찾고, 인수와 함께 적절한 컨트롤러와 메소드를 호출합니다.

라우팅에 대한 자세한 내용은 URI 라우팅 설명서를 참조하십시오.

여기서, $routes 객체의 두 번째 규칙은 URI 경로 /pages에 대한 GET 요청과 Pages 클래스의 index() 메소드를 연결합니다.

$routes 객체의 세 번째 규칙은 URI 세그먼트에 대한 GET 요청을 자리 표시자 (:segment)를 사용하여 일치시키고, 그 파라미터를 Pages 클래스의 view() 메소드에 전달합니다.

앱 실행(Running the App)

테스트 준비가 되었나요? PHP의 내장 서버는 public 폴더에 있는 .htaccess 규칙(rule)을 제대로 처리하지 못하므로 URL에 “index.php/” 없이 앱을 실행할 수 없습니다. CodeIgniter는 이를 위해 보완하는 자체 명령을 가지고 있습니다.

커맨드 라인에서 프로젝트의 루트(root)로 이동하여 다음과 같이 입력합니다.

> php spark serve

포트 8080을 통하여 액세스할 수 있는 웹 서버를 시작됩니다. 브라우저에서 localhost:8080을 입력하면 CodeIgniter Welcome 페이지가 나타나야 합니다.

이제 localhost:8080/home을 확인합시다. pages 컨트롤러의 view() 메소드로 올바르게 라우팅되었나요? 멋지지 않나요?!?!

다음과 같은지 보세요.:

../_images/tutorial1.png

Note

경로를 수동으로 지정할 때는 Routes.php 파일에서 $routes->setAutoRoute(false);를 설정하여 자동 라우팅을 비활성화하는 것이 좋습니다. 이렇게 하면 정의한 경로만 액세스할 수 있습니다.

이제 브라우저 몇 개의 URL을 입력하여 위에서 만든 Pages 컨트롤러가 어떻게 동작하는지 확인하십시오.

URL

출력

localhost:8080/

CodeIgniter “welcome” 페이지. Home 컨트롤러 index() 메소드의 결과입니다.

localhost:8080/pages

“index”가 기본 컨트롤러 메소드이기 때문에 Pages 컨트롤러 내의 index 메소드의 결과인 CodeIgniter “welcome” 페이지를 표시합니다.

localhost:8080/home

우리가 명시적으로 요청했기 때문에 위에서 만든 “home” 페이지를 표시합니다. Pages 컨트롤러의 view() 메소드의 결과입니다.

localhost:8080/pages/about

명시적으로 요청했기 때문에 위에 만든 “about” 페이지를 표시

localhost:8080/pages/shop

app/Views/pages/shop.php가 없기 때문에 “404-File Not Found” 오류 페이지