Kontrolerji v lastnem MVC ogrodju v PHP
Kot že veste, imajo vsi kontrolerji našega
ogrodja metodo render, ki
jo je treba klicati za pošiljanje podatkov v pogled.
To metodo naši, uporabniški kontrolerji,
podedujejo od nadrejenega razreda Controller,
ki se nahaja v jedru. Naredimo ta razred:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
Kot vidite, metoda render kot parameter
sprejme ime pogleda in podatke za
prikaz. Naj ta metoda vrne
objekt posebnega razreda Page, v
katerem bo vsebovala informacije o pogledu
podatkov akcije kontrolerja. V tem razredu
bo vsebovano ime pogleda, podatki,
pa tudi naslov strani in ime datoteke z postavitvijo
spletišča:
<?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;
}
}
?>
Takrat bo koda naše metode render
videti takole:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
Naj pojasnim, kaj se tu dogaja. Ime pogleda
in podatki pridejo kot parametri metode. Vendar,
v uporabniškem kontrolerju je nastavljen še
naslov strani - z zapisovanjem lastnosti
title. To pomeni, da bo v $this->title
vsebovan naslov, ki ga bomo posredovali
konstruktorju razreda Page.
Obstajajo tudi nianse z postavitvijo. Kot veste,
naše ogrodje uporablja postavitev iz datoteke
default.php. Pravzaprav lahko vsaka
akcija ima tudi drugačno postavitev. Za
to je treba v sami akciji v lastnost layout
zapisati drugo ime postavitve.
Kako se to doseže: naš nadrejeni kontroler
ima lastnost layout, ki privzeto
ima vrednost 'default.php'. To
bo privzeta postavitev. Vendar, če
akcija uporabniškega kontrolerja predefinira
vrednost lastnosti layout, bo tudi postavitev
drugačna.
Kopirajte kodo mojega razreda Controller in ga razmestite v datoteko
/core/Controller.php.
Kopirajte kodo mojega razreda Page in
ga razmestite v datoteko /core/Page.php.