Controller nel proprio framework MVC in PHP
Come già sapete, tutti i controller del nostro
framework hanno il metodo render, che
deve essere chiamato per inviare i dati alla vista.
Questo metodo viene ereditato dai nostri controller
utente dalla classe genitore Controller,
posizionata nel core. Creiamo questa classe:
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
Come potete vedere, il metodo render accetta come parametro
il nome della vista e i dati per
la visualizzazione. Lasciamo che questo metodo restituisca
un oggetto di una speciale classe Page, in
cuì conterrà le informazioni sulla visualizzazione
dei dati dell'azione del controller. In questa classe
conterrà il nome della vista, i dati,
così come il titolo della pagina e il nome del file di layout
del sito:
<?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;
}
}
?>
Allora il codice del nostro metodo render
sarà così:
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
Spiego cosa succede qui. Il nome della vista
e i dati arrivano come parametri del metodo. Tuttavia,
nel controller utente viene impostato anche
il titolo della pagina - tramite l'impostazione della proprietà
title. Ciò significa che in $this->title
conterrà il titolo che passeremo
al costruttore della classe Page.
Ci sono anche dettagli riguardanti il layout. Come sapete,
il nostro framework utilizza un layout dal file
default.php. In realtà, ogni
azione può avere un layout diverso. Per
farlo, è necessario nell'azione stessa nella proprietà layout
impostare un altro nome per il layout.
Come si ottiene: il nostro controller genitore
ha una proprietà layout, di default
con valore 'default.php'. Questo
sarà il layout predefinito. Tuttavia, se
l'azione del controller utente sovrascrive
il valore della proprietà layout, allora anche il layout
sarà diverso.
Copia il codice della mia classe Controller e posizionalo nel file
/core/Controller.php.
Copia il codice della mia classe Page e
posizionalo nel file /core/Page.php.