정적 페이지(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>© 2021</em>
</body>
</html>
Note
header.php 템플릿을 자세히 보면 esc() 함수를 사용하고 있습니다. XSS 공격을 방지하기 위해 CodeIgniter에서 제공하는 글로벌 기능입니다. 자세한 내용은 여기를 참조하십시오.
컨트롤러에 로직 추가
앞서 우리는 view()
메소드를 컨트롤러에 추가했다. 이 메소드는 $Page
라는 하나의 파라미터를 허용합니다.
정적(static) 페이지 본문은 app/Views/pages/ 디렉터리에 위치합니다.
그 디렉터리에 home.php과 about.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()
메소드로 올바르게 라우팅되었나요?
멋지지 않나요?!?!
다음과 같은지 보세요.:
Note
경로를 수동으로 지정할 때는 Routes.php 파일에서 $routes->setAutoRoute(false);
를 설정하여 자동 라우팅을 비활성화하는 것이 좋습니다.
이렇게 하면 정의한 경로만 액세스할 수 있습니다.
이제 브라우저 몇 개의 URL을 입력하여 위에서 만든 Pages
컨트롤러가 어떻게 동작하는지 확인하십시오.
URL |
출력 |
---|---|
localhost:8080/ |
CodeIgniter “welcome” 페이지. |
localhost:8080/pages |
“index”가 기본 컨트롤러 메소드이기 때문에 Pages 컨트롤러 내의 index 메소드의 결과인 CodeIgniter “welcome” 페이지를 표시합니다. |
localhost:8080/home |
우리가 명시적으로 요청했기 때문에 위에서 만든 “home” 페이지를
표시합니다. |
localhost:8080/pages/about |
명시적으로 요청했기 때문에 위에 만든 “about” 페이지를 표시 |
localhost:8080/pages/shop |
app/Views/pages/shop.php가 없기 때문에 “404-File Not Found” 오류 페이지 |