Кантролеры ў сваім MVC фрэймворку на PHP
Як вы ўжо ведаеце, усе кантролеры нашага
фрэймворка маюць метад 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
запісаць іншае імя лэйаўта.
Як гэта дасягаецца: наш бацькоўскі кантролер
мае ўласцівасць layout, па змаўчанні
якое мае значэнне 'default.php'. Гэта
і будзе лэйаўтам па змаўчанні. Аднак, калі
дзеянне карыстальніцкага кантролера перавызначыць
значэнне ўласцівасці layout, то і лэйаўт
будзе іншым.
Скапіруйце код майго класа Controller і размясціце яго ў файле
/core/Controller.php.
Скапіруйце код майго класа Page і
размясціце яго ў файле /core/Page.php.