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