Kontrollerid oma MVC raamistikus PHP-s
Nagu te juba teate, on kõigil meie raamistiku
kontrolleritel meetod render, mida
tuleb kutsuda andmete saatmiseks vaatesse.
Selle meetodi pärivad meie kasutajate loodud kontrollerid
ülemklassist Controller,
mis asub tuumas. Teeme selle klassi:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
Nagu näete, võtab meetod render parameetritena
vastu vaate nime ja andmed
kuvamiseks. Olgu see meetod tagastab
spetsiaalse klassi Page objekti,
mis sisaldab teavet kontrolleri tegevuse
andmete vaate kohta. Selles klassis
sisalduvad vaate nimi, andmed,
samuti lehe pealkiri ja saidi maketi
faili nimi:
<?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;
}
}
?>
Siis näeb meie meetodi render kood
välja selline:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
Selgitan, mis siin toimub. Vaate nimi
ja andmed tulevad meetodi parameetritena. Kuid
kasutaja kontrolleris määratakse ka
lehe pealkiri - omaduse
title kirjutamise teel. Seega
sisaldub $this->title-s
pealkiri, mille me edastame
klassi Page konstruktorile.
On ka nüansse maketiga. Nagu te teate,
kasutab meie raamistik maketit failist
default.php. Tegelikult võib
iga tegevus omada ka teist maketit.
Selleks tuleb tegevuses endas omadusse layout
kirjutada teine maketi nimi.
Kuidas see saavutatakse: meie ülemkontrolleril
on omadus layout, mille vaikeväärtus on
'default.php'. See
ongi vaikimisi maketiks. Kui aga
kasutaja kontrolleri tegevus muudab
omaduse layout väärtust, siis on ka makett
teine.
Kopeerige minu klassi Controller kood ja asetage see faili
/core/Controller.php.
Kopeerige minu klassi Page kood ja
asetage see faili /core/Page.php.