PHP MVC 프레임워크의 컨트롤러
이미 아시다시피, 우리 프레임워크의 모든 컨트롤러는
뷰로 데이터를 전송하기 위해 호출해야 하는
render 메서드를 가지고 있습니다.
이 메서드는 우리의 사용자 정의 컨트롤러들이
코어에 위치한 부모 클래스 Controller로부터
상속받습니다. 이 클래스를 만들어 봅시다:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
보시다시피, render 메서드는 매개변수로
뷰 이름과 표시할 데이터를 받습니다.
이 메서드가 컨트롤러 액션의 데이터 표현에 대한
정보를 담고 있는 특별한 클래스 Page의
객체를 반환하도록 합시다. 이 클래스에는
뷰 이름, 데이터, 그리고 페이지 제목과
사이트 레이아웃 파일 이름이 포함될 것입니다:
<?php
namespace Core;
class Page
{
private $layout;
private $title;
private $view;
private $data;
public function __construct($layout, $title, $view, $data)
{
$this->layout = $layout;
$this->title = $title;
$this->view = $view;
$this->data = $data;
}
public function __get($property)
{
return $this->$property;
}
}
?>
그렇다면 우리의 render 메서드 코드는
다음과 같이 될 것입니다:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
여기서 어떤 일이 일어나는지 설명하겠습니다. 뷰 이름과
데이터는 메서드의 매개변수로 전달됩니다. 그러나,
사용자 정의 컨트롤러에서는 속성 title에
값을 할당하여 페이지 제목도 설정합니다. 이는
$this->title에 페이지 제목이 담겨 있으며,
이것을 Page 클래스의 생성자에 전달한다는 의미입니다.
레이아웃에도 세부 사항이 있습니다. 아시다시피,
우리 프레임워크는 default.php 파일의 레이아웃을 사용합니다.
사실, 각 액션은 다른 레이아웃을 가질 수도 있습니다.
이를 위해서는 액션 자체에서 layout 속성에
다른 레이아웃 이름을 할당해야 합니다.
이것이 어떻게 달성되는지: 우리의 부모 컨트롤러는
기본값으로 'default.php' 값을 가지는 속성
layout를 가지고 있습니다. 이것이 기본 레이아웃이 될 것입니다.
그러나, 사용자 정의 컨트롤러의 액션이 layout 속성 값을
재정의하면 레이아웃도 달라지게 됩니다.
제 Controller 클래스 코드를 복사하여
/core/Controller.php 파일에 배치하세요.
제 Page 클래스 코드를 복사하여
/core/Page.php 파일에 배치하세요.