Contrôleurs dans votre propre framework MVC en PHP
Comme vous le savez déjà, tous les contrôleurs de notre
framework ont une méthode render, qui
doit être appelée pour envoyer les données à la vue.
Cette méthode est héritée par nos contrôleurs utilisateurs
de la classe parente Controller,
située dans le noyau. Créons cette classe :
<?php
namespace Core;
class Controller
{
protected function render($view, $data) {
}
}
?>
Comme vous le voyez, la méthode render accepte en paramètre
le nom de la vue et les données à
afficher. Supposons que cette méthode retourne
un objet d'une classe spéciale Page, dans
laquelle seront contenues les informations sur la représentation
des données de l'action du contrôleur. Cette classe
contiendra le nom de la vue, les données,
ainsi que le titre de la page et le nom du fichier de mise en page
du site :
<?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;
}
}
?>
Alors le code de notre méthode render
ressemblera à ceci :
<?php
namespace Core;
class Controller
{
protected $layout = 'default';
protected function render($view, $data) {
return new Page($this->layout, $this->title, $view, $data);
}
}
?>
Je vais expliquer ce qui se passe ici. Le nom de la vue
et les données arrivent en paramètres de la méthode. Cependant,
le titre de la page est également défini
dans le contrôleur utilisateur - en écrivant la propriété
title. Cela signifie que $this->title
contiendra le titre que nous transmettrons
au constructeur de la classe Page.
Il y a aussi des nuances concernant le layout. Comme vous le savez,
notre framework utilise un layout provenant du fichier
default.php. En réalité, chaque
action peut avoir un layout différent. Pour
cela, il faut que l'action elle-même écrive un autre nom de layout dans la propriété layout.
Comment cela est réalisé : notre contrôleur parent
a une propriété layout, ayant par défaut
la valeur 'default.php'. Ceci
sera le layout par défaut. Cependant, si
l'action du contrôleur utilisateur redéfinit
la valeur de la propriété layout, alors le layout
sera différent.
Copiez le code de ma classe Controller et placez-le dans le fichier
/core/Controller.php.
Copiez le code de ma classe Page et
placez-le dans le fichier /core/Page.php.