Controllers in je eigen MVC-framework in PHP
Zoals je al weet, hebben alle controllers in ons
framework een methode render, die
aangeroepen moet worden om gegevens naar de view te sturen.
Deze methode erven onze, gebruikerscontrollers,
van de bovenliggende klasse Controller,
gelegen in de kern. Laten we deze klasse maken:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
Zoals je ziet, accepteert de methode render als parameter
de naam van de view en de gegevens voor
weergave. Laat deze methode een
object teruggeven van een speciale klasse Page, waarin
de informatie over de weergave van de
gegevens van de controlleractie zal bevatten. In deze klasse
zullen de viewnaam, gegevens,
evenals de paginatitel en de bestandsnaam met de layout
van de site staan:
<?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;
}
}
?>
Dan zal de code van onze methode render er
zo uitzien:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
Ik zal uitleggen wat hier gebeurt. De viewnaam
en gegevens komen binnen als parameters van de methode. Echter,
in de gebruikerscontroller wordt ook nog
de paginatitel ingesteld - door de eigenschap
title in te vullen. Dat betekent dat in $this->title
de titel zal zitten die we doorgeven aan de
constructor van de klasse Page.
Er zijn ook nuances met de layout. Zoals je weet,
gebruikt ons framework een layout uit het bestand
default.php. Eigenlijk kan elke
actie ook een andere layout hebben. Hiervoor
moet in de actie zelf in de eigenschap layout
een andere layoutnaam worden ingevuld.
Hoe dit bereikt wordt: onze bovenliggende controller
heeft een eigenschap layout, die standaard
de waarde 'default.php' heeft. Dit
zal de standaardlayout zijn. Echter, als
de actie van de gebruikerscontroller de
waarde van de eigenschap layout overschrijft,
dan zal de layout anders zijn.
Kopieer de code van mijn klasse Controller en plaats deze in het bestand
/core/Controller.php.
Kopieer de code van mijn klasse Page en
plaats deze in het bestand /core/Page.php.