Controlere în cadrul propriului tău framework MVC în PHP
După cum știți deja, toate controlerele din
framework-ul nostru au metoda render, care
trebuie apelată pentru a trimite datele către view.
Această metodă este moștenită de controlerele
noastre, cele personalizate, de la clasa părinte Controller,
aflată în nucleu. Să creăm această clasă:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
După cum vedeți, metoda render primește ca parametru
numele view-ului și datele pentru
afișare. Să facem ca această metodă să returneze
un obiect al unei clase speciale Page, în
care vor fi conținute informații despre view-ul
datelor acțiunii controlerului. În această clasă
vor fi conținute numele view-ului, datele,
precum și titlul paginii și numele fișierului cu layout-ul
site-ului:
<?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;
}
}
?>
Atunci codul metodei noastre render va
arăta astfel:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
Să explic ce se întâmplă aici. Numele view-ului
și datele vin ca parametri ai metodei. Cu toate acestea,
în controlerul personalizat se mai setează
și titlul paginii - prin scrierea proprietății
title. Înseamnă că în $this->title
va fi conținut titlul pe care îl vom transmite
constructorului clasei Page.
Există și nuanțe cu layout-ul. După cum știți,
framework-ul nostru folosește layout-ul din fișierul
default.php. De fapt, fiecare
acțiune poate avea și alt layout. Pentru
aceasta este nevoie ca în acțiunea însăși, în proprietatea layout
să se scrie un alt nume de layout.
Cum se realizează acest lucru: controlerul nostru părinte
are proprietatea layout, care în mod implicit
are valoarea 'default.php'. Acesta
va fi layout-ul implicit. Cu toate acestea, dacă
acțiunea controlerului personalizat redefește
valoarea proprietății layout, atunci și layout-ul
va fi altul.
Copiați codul clasei mele Controller și plasați-l în fișierul
/core/Controller.php.
Copiați codul clasei mele Page și
plasați-l în fișierul /core/Page.php.