Контролери в собствен 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.