Kontroleriai savame MVC karkase PHP
Kaip jau žinote, visi mūsų karkaso
kontroleriai turi metodą render, kurį
reikia iškviesti norint siųsti duomenis į vaizdą.
Šį metodą mūsų, vartotojo sukurti kontroleriai,
paveldi iš tėvinės klasės Controller,
esančios branduolyje. Sukurkime šią klasę:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
Kaip matote, metodas render parametrais
priima vaizdo pavadinimą ir duomenis
atvaizdavimui. Tegul šis metodas grąžina
specialios klasės Page objektą, kuriame
bus saugoma informacija apie kontrolerio
veiksmo duomenų vaizdą. Šioje klasėje
bus saugomas vaizdo pavadinimas, duomenys,
taip pat puslapio antraštė ir svetainės
maketo failo pavadinimas:
<?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;
}
}
?>
Tada mūsų metodo render kodas
atrodys taip:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
Paaiškinsiu, kas čia vyksta. Vaizdo pavadinimas
ir duomenys ateina metodo parametrais. Tačiau,
vartotojo kontroleryje taip pat nustatoma
ir puslapio antraštė - įrašant savybę
title. Vadinasi, $this->title
ir bus talpinama antraštė, kurią perduosime
klasės Page konstruktoriui.
Yra ir niuansų su maketu. Kaip žinote,
mūsų karkasas naudoja maketą iš failo
default.php. Tiesą sakant, kiekvienas
veiksmas gali turėti ir kitą maketą. Tam
reikia pačiame veiksme į savybę layout
įrašyti kitą maketo pavadinimą.
Kaip tai pasiekiama: mūsų tėvinis kontroleris
turi savybę layout, pagal nutylėjimą
turinčią reikšmę 'default.php'. Tai
ir bus maketas pagal nutylėjimą. Tačiau, jei
vartotojo kontrolerio veiksmas perrašys
savybės layout reikšmę, tai ir maketas
bus kitoks.
Nukopijuokite mano klasės Controller kodą ir patalpinkite jį faile
/core/Controller.php.
Nukopijuokite mano klasės Page kodą ir
patalpinkite jį faile /core/Page.php.