Controllere i dit eget MVC framework i PHP
Som du allerede ved, har alle controllere i vores
framework en metode render, som
skal kaldes for at sende data til visningen.
Denne metode arver vores brugerdefinerede controllere
fra forældreklassen Controller,
placeret i kernen. Lad os lave denne klasse:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
Som du kan se, tager metoden render parametre
med navnet på visningen og data til
visning. Lad denne metode returnere
et objekt af en speciel klasse Page, hvor
information om visningen af
controllerens handling vil være indeholdt. I denne klasse
vill være indeholdt navnet på visningen, data,
samt sidetitlen og filnavnet med websitets layout
:
<?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;
}
}
?>
Så vil koden for vores render metode
se sådan ud:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
Lad mig forklare, hvad der sker her. Visningsnavnet
og data modtages som parametre til metoden. Der er dog også
en sidetitel sat i brugercontrolleren - ved at tildele egenskaben
title. Det betyder, at $this->title
vil indeholde titlen, som vi vil videregive
til konstruktøren af klassen Page.
Der er også nuancer med layoutet. Som du ved,
bruger vores framework et layout fra filen
default.php. Faktisk kan hver
handling have et andet layout. For
at gøre dette skal handlingen selv tildele egenskaben layout
et andet layoutnavn.
Hvordan dette opnås: vores forældrecontroller
har en egenskab layout, som standard
har værdien 'default.php'. Dette
vil være standardlayoutet. Hvis
en handling i brugercontrolleren dog tildeler
egenskaben layout en anden værdi, vil layoutet
også være anderledes.
Kopier koden for min klasse Controller og placer den i filen
/core/Controller.php.
Kopier koden for min klasse Page og
placer den i filen /core/Page.php.