Кантролеры ў сваім MVC фрэймворку на PHP

Як вы ўжо ведаеце, усе кантролеры нашага фрэймворка маюць метад 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 запісаць іншае імя лэйаўта.

Як гэта дасягаецца: наш бацькоўскі кантролер мае ўласцівасць layout, па змаўчанні якое мае значэнне 'default.php'. Гэта і будзе лэйаўтам па змаўчанні. Аднак, калі дзеянне карыстальніцкага кантролера перавызначыць значэнне ўласцівасці layout, то і лэйаўт будзе іншым.

Задание 1

Скапіруйце код майго класа Controller і размясціце яго ў файле /core/Controller.php.

Задание 2

Скапіруйце код майго класа Page і размясціце яго ў файле /core/Page.php.