뷰(Views)
뷰는 단순히 웹 페이지이거나 헤더, 푸터, 사이드바와 같은 페이지의 일부분입니다. 사실 뷰는 이러한 계층 구조가 필요한 경우 다른 뷰 내에 유연하게 포함될 수 있습니다.
뷰는 절대로 직접 호출되지 않으며, 반드시 컨트롤러나 뷰 라우트에 의해 로드되어야 합니다.
MVC 프레임워크에서 컨트롤러는 교통 경찰과 같은 역할을 하므로 특정 뷰를 가져올 책임이 있다는 점을 기억하십시오. 아직 컨트롤러 페이지를 읽지 않으셨다면 계속 진행하기 전에 읽어보시기 바랍니다.
컨트롤러 페이지에서 만든 예제 컨트롤러를 사용하여 뷰를 추가해 보겠습니다.
뷰 생성하기
텍스트 에디터를 사용하여 blog_view.php라는 파일을 만들고 다음 내용을 입력하십시오:
<html>
<head>
<title>My Blog</title>
</head>
<body>
<h1>Welcome to my Blog!</h1>
</body>
</html>
그런 다음 파일을 app/Views 디렉토리에 저장하십시오.
뷰 표시하기
특정 뷰 파일을 로드하고 표시하려면 컨트롤러에서 다음과 같이 view() 함수를 사용합니다.
return view('name');
여기서 name은 뷰 파일의 이름입니다.
중요
파일 확장자가 생략된 경우, 뷰 파일은 .php 확장자로 끝나는 것으로 간주됩니다.
참고
view() 함수는 내부적으로 렌더러 보기를 사용합니다.
이제 app/Controllers 디렉토리에 Blog.php라는 파일을 만들고 다음 내용을 입력하십시오.
<?php
namespace App\Controllers;
class Blog extends BaseController
{
public function index()
{
return view('blog_view');
}
}
app/Config/Routes.php에 있는 라우팅 파일을 열고 “Route Definitions”를 찾아 다음 코드를 추가하십시오.
use App\Controllers\Blog;
$routes->get('blog', [Blog::class, 'index']);
사이트에 접속하면 새로운 뷰를 볼 수 있을 것입니다. URL은 다음과 유사할 것입니다:
example.com/index.php/blog/
여러 뷰 로드하기
CodeIgniter는 컨트롤러 내에서 view()를 여러 번 호출하는 것을 지능적으로 처리합니다. 두 번 이상 호출되면 호출된 순서대로 합쳐집니다.
예를 들어 헤더 뷰, 메뉴 뷰, 콘텐츠 뷰, 그리고 푸터 뷰를 따로 가지고 싶다면 다음과 같이 작성할 수 있습니다.
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
class Page extends Controller
{
public function index()
{
$data = [
'page_title' => 'Your title',
];
return view('header')
. view('menu')
. view('content', $data)
. view('footer');
}
}
위의 예제에서는 아래에서 설명할 “동적으로 추가된 데이터”를 사용하고 있습니다.
하위 디렉토리에 뷰 저장하기
뷰 파일을 하위 디렉토리에 저장하여 정리하고 싶다면 그렇게 할 수 있습니다. 이 경우 뷰를 로드할 때 디렉토리 이름을 포함해야 합니다. 예:
return view('directory_name/file_name');
네임스페이스가 지정된 뷰
네임스페이스가 지정된 Views 디렉토리 아래에 뷰를 저장하고, 네임스페이스를 사용하는 것처럼 해당 뷰를 로드할 수 있습니다. PHP는 네임스페이스에서 클래스가 아닌 파일을 로딩하는 것을 지원하지 않지만, CodeIgniter는 재사용이나 배포가 쉽도록 뷰를 모듈 방식으로 묶을 수 있는 이 기능을 제공합니다.
Example\Blog 네임스페이스로 오토로더에 PSR-4 매핑이 설정된 example/blog 디렉토리가 있다면, 뷰 파일도 네임스페이스가 지정된 것처럼 가져올 수 있습니다.
이 예에 따라, 뷰 이름 앞에 네임스페이스를 붙여 example/blog/Views에서 blog_view.php 파일을 로드할 수 있습니다. (Example\Blog\Views\와 같이 마지막 디렉토리인 Views를 명시할 필요는 없습니다.)
<?php
return view('Example\Blog\blog_view');
참고
네임스페이스가 지정된 뷰를 참조할 때는 반드시 백슬래시(\)를 사용해야 합니다. 이것이 CodeIgniter가 네임스페이스 뷰와 일반 파일 경로를 구분하는 방법이기 때문입니다. 슬래시(/)는 표준 app/Views 폴더 내의 하위 디렉토리에만 사용됩니다.
네임스페이스 뷰 오버라이딩
Added in version 4.7.0.
애플리케이션의 app/Views 디렉토리 내에 일치하는 디렉토리 구조를 생성하여 네임스페이스가 지정된 뷰를 오버라이드할 수 있습니다. 이를 통해 모듈이나 패키지의 핵심 소스 코드를 수정하지 않고도 출력을 커스터마이징할 수 있습니다.
설정
기본적으로 오버라이드 파일은 app/Views/overrides 디렉토리에서 찾습니다. app/Config/View.php의 $appOverridesFolder 속성을 통해 이 위치를 설정할 수 있습니다.
public string $appOverridesFolder = 'overrides';
하위 디렉토리 없이 app/Views의 루트에 직접 네임스페이스를 매핑하고 싶다면 이 값을 빈 문자열('')로 설정하면 됩니다.
예제
네임스페이스가 Example\Blog인 Blog 모듈이 있다고 가정해 봅시다. 원본 뷰 파일의 위치는 다음과 같습니다.
/modules
└── Example
└── Blog
└── Views
└── blog_view.php
이 뷰를 오버라이드하려면(기본 설정을 사용하는 경우), app/Views/overrides 내의 일치하는 경로에 파일을 생성합니다.
/app
└── Views
└── overrides <-- Configured $appOverridesFolder
└── Example <-- Matches the first part of namespace
└── Blog <-- Matches the second part of namespace
└── blog_view.php <-- Your custom view
이제 view('Example\Blog\blog_view')를 호출하면, CodeIgniter는 원본 모듈 뷰 파일 대신 app/Views/overrides/Example/Blog/blog_view.php에서 커스텀 뷰를 자동으로 로드합니다.
참고
오버라이드 경로는 뷰를 참조하는 방식과 정확히 일치해야 합니다. 뷰를 view('Example\Blog\blog_view')로 로드한다면 오버라이드 경로는 app/Views/overrides/Example/Blog/blog_view.php가 됩니다. 하지만 호출 시 view('Example\Blog\Views\blog_view')와 같이 Views 디렉토리를 명시적으로 포함했다면, 오버라이드 경로에도 이를 포함해야 합니다: app/Views/overrides/Example/Blog/Views/blog_view.php
뷰 캐싱
view() 함수의 세 번째 매개변수에 cache 옵션과 캐시 기간(초)을 전달하여 뷰를 캐시할 수 있습니다.
// Cache the view for 60 seconds
return view('file_name', $data, ['cache' => 60]);
기본적으로 뷰는 뷰 파일 자체의 이름을 사용하여 캐시됩니다. cache_name과 함께 사용할 캐시 ID를 전달하여 이를 커스터마이징할 수 있습니다.
// Cache the view for 60 seconds
return view('file_name', $data, ['cache' => 60, 'cache_name' => 'my_cached_view']);
뷰에 동적 데이터 추가하기
데이터는 view() 함수의 두 번째 매개변수인 배열을 통해 컨트롤러에서 뷰로 전달됩니다.
예제:
$data = [
'title' => 'My title',
'heading' => 'My Heading',
'message' => 'My Message',
];
return view('blog_view', $data);
컨트롤러 파일로 시도해 봅시다. 파일을 열고 다음 코드를 추가하십시오.
<?php
namespace App\Controllers;
class Blog extends BaseController
{
public function index()
{
$data['title'] = 'My Real Title';
$data['heading'] = 'My Real Heading';
return view('blog_view', $data);
}
}
이제 뷰 파일을 열고 텍스트를 데이터 배열의 키와 일치하는 변수로 변경하십시오:
<html>
<head>
<title><?= esc($title) ?></title>
</head>
<body>
<h1><?= esc($heading) ?></h1>
</body>
</html>
사용하던 URL로 페이지를 로드하면 변수들이 대체된 것을 볼 수 있습니다.
saveData 옵션
전달된 데이터는 이후에 호출되는 view()를 위해 유지됩니다. 단일 요청에서 함수를 여러 번 호출하는 경우, 각 view() 호출마다 매번 데이터를 전달할 필요가 없습니다.
하지만 이로 인해 데이터가 다른 뷰로 “새어 나가(bleeding)” 문제를 일으킬 수도 있습니다. 한 번의 호출 후에 데이터를 지우고 싶다면, 세 번째 매개변수의 $option 배열에 saveData 옵션을 전달할 수 있습니다.
$data = [
'title' => 'My title',
'heading' => 'My Heading',
'message' => 'My Message',
];
return view('blog_view', $data, ['saveData' => false]);
또한 view() 함수의 기본 동작이 호출 사이에 데이터를 지우는 것이 되도록 하려면, app/Config/Views.php에서 $saveData를 false로 설정하면 됩니다.
루프 생성하기
뷰 파일에 전달하는 데이터 배열은 단순한 변수에 국한되지 않습니다. 다차원 배열을 전달하여 루프를 통해 여러 행을 생성할 수 있습니다. 예를 들어 데이터베이스에서 데이터를 가져오면 일반적으로 다차원 배열 형태가 됩니다.
간단한 예제입니다. 컨트롤러에 다음을 추가하십시오.
<?php
namespace App\Controllers;
class Blog extends BaseController
{
public function index()
{
$data = [
'todo_list' => ['Clean House', 'Call Mom', 'Run Errands'],
'title' => 'My Real Title',
'heading' => 'My Real Heading',
];
return view('blog_view', $data);
}
}
이제 뷰 파일을 열고 루프를 만드십시오.
<html>
<head>
<title><?= esc($title) ?></title>
</head>
<body>
<h1><?= esc($heading) ?></h1>
<h2>My Todo List</h2>
<ul>
<?php foreach ($todo_list as $item): ?>
<li><?= esc($item) ?></li>
<?php endforeach ?>
</ul>
</body>
</html>