PHP MVC 프레임워크의 컨트롤러

이미 아시다시피, 우리 프레임워크의 모든 컨트롤러는 뷰로 데이터를 전송하기 위해 호출해야 하는 render 메서드를 가지고 있습니다. 이 메서드는 우리의 사용자 정의 컨트롤러들이 코어에 위치한 부모 클래스 Controller로부터 상속받습니다. 이 클래스를 만들어 봅시다:

/core/Controller.php<?php
  namespace Core;
  
  class Controller
  {
    protected function render($view, $data) {
      
    }
  }
?>

보시다시피, render 메서드는 매개변수로 뷰 이름과 표시할 데이터를 받습니다. 이 메서드가 컨트롤러 액션의 데이터 표현에 대한 정보를 담고 있는 특별한 클래스 Page의 객체를 반환하도록 합시다. 이 클래스에는 뷰 이름, 데이터, 그리고 페이지 제목과 사이트 레이아웃 파일 이름이 포함될 것입니다:

/core/Page.php<?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 메서드 코드는 다음과 같이 될 것입니다:

/core/Controller.php<?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 속성 값을 재정의하면 레이아웃도 달라지게 됩니다.

Задание 1

제 Controller 클래스 코드를 복사하여 /core/Controller.php 파일에 배치하세요.

Задание 2

제 Page 클래스 코드를 복사하여 /core/Page.php 파일에 배치하세요.