뷰 레이아웃(View Layout)

CodeIgniter는 간단하지만 매우 유연한 레이아웃 시스템을 지원하므로 어플리케이션에서 하나 이상의 기본 페이지 레이아웃을 간단하게 사용할 수 있습니다. 레이아웃은 랜더링되는 모든 뷰에 삽입할 수있는 컨텐츠 섹션을 지원합니다. 1열, 2열, 블로그 아카이브 페이지 등을 지원하기 위해 다른 레이아웃을 만들 수 있습니다. 레이아웃은 절대 직접 랜더링되지 않으며, 레이아웃 지정하여 확장하려는 뷰를 랜더링합니다.

레이아웃 만들기

레이아웃은 뷰와 같습니다. 뷰와 유일한 차이점은 renderSection() 메소드를 사용한다는 것입니다. 이 메소드는 컨텐츠의 자리 표시자 역할을 합니다.

E.g. app/Views/default.php:

<!doctype html>
<html>
<head>
    <title>My Layout</title>
</head>
<body>
    <?= $this->renderSection('content') ?>
</body>
</html>

renderSection() 메소드에는 섹션 이름이라는 하나의 인수만 있습니다. 이렇게 하면 모든 자식 뷰에서 내용 섹션의 이름을 알 수 있습니다.

뷰에서 레이아웃 사용

뷰를 레이아웃에 삽입하려면 맨 위에 extend() 메소드를 사용해야 합니다.

<?= $this->extend('default') ?>

extend 메소드는 사용하려는 뷰 파일의 이름을 사용합니다. 표준 뷰이므로 뷰와 같은 위치에 배치됩니다. 기본적으로 어플리케이션의 View 디렉토리를 확인하지만 PSR-4 정의 네임스페이스도 검색합니다. 네임스페이스를 지정하여 특정 뷰 디렉토리에서 뷰를 찾을 수 있습니다.

<?= $this->extend('Blog\Views\default') ?>

레이아웃을 확장하는 뷰는 section($name)endSection() 메소드 호출이 포함되어야 합니다. 이러한 호출 사이의 모든 내용은 섹션 이름과 일치하는 renderSection($name) 호출이 있을 경우 레이아웃에 삽입됩니다.

E.g. app/Views/some_view.php:

<?= $this->extend('default') ?>

<?= $this->section('content') ?>
    <h1>Hello World!</h1>
<?= $this->endSection() ?>

endSection()은 섹션 이름이 필요하지 않으며, 어느 것을 닫아야하는지 자동으로 인식합니다.

Sections can contain nested sections

<?= $this->extend('default') ?>

<?= $this->section('content') ?>
    <h1>Hello World!</h1>
    <?= $this->section('javascript') ?>
       let a = 'a';
    <?= $this->endSection() ?>
<?= $this->endSection() ?>

뷰 랜더링

레이아웃 랜더링은 다른 뷰가 컨트롤러 내에 하는것처럼 동일하게 수행됩니다.

<?php

namespace App\Controllers;

class MyController extends BaseController
{
    public function index()
    {
        return view('some_view');
    }
}

app/Views/some_view.php를 렌더링하고 default를 확장하면 app/Views/default.php 레이아웃도 자동으로 사용됩니다. 렌더러는 매우 똑똑하여 뷰를 자체적으로 랜더링해야 할지, 레이아웃과 함께 랜더링해야 할지 감지할 수 있습니다.

부분(Partial) 뷰 포함

부분 뷰는 레이아웃을 확장하지 않는 뷰 파일입니다. 여기에는 일반적으로 재사용할 수있는 컨텐츠가 포함됩니다. $this->include()를 사용하여 뷰 레이아웃dp 부분 뷰를 포함시킬수 있습니다.

<?= $this->extend('default') ?>

<?= $this->section('content') ?>
    <h1>Hello World!</h1>

    <?= $this->include('sidebar') ?>
<?= $this->endSection() ?>

include() 메소드를 호출할 때 캐시 지시문 등을 포함하여 랜더링에 사용되는 옵션을 일반 뷰에 전달할 수 있습니다.