Как вы уже знаете, все контроллеры нашего
фреймворка имеют метод 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
.