12.Zend Framework 2 et 3

12.6.Modèle MVC

12.6.3.MVC: Le contrôleur

12.6.3.1.Introduction

Bien que figurant en troisième position dans le sigle MVC, le contrôleur peut être vu comme le premier étage de la fusée. Comme nous l'avons vu dans le chapitre sur le routage[où?], la saisie d'une URL dans le navigateur conduit à déclencher une action dans un contrôleur donné.
D'une manière générale, le contrôleur permet de traiter la demande. C'est cette portion de code qui va traiter les paramètres d'entrée, réaliser les opérations demandées (les actions) en manipulant les données (le modèle) et au final retourner un résultat qui, dans la majeure partie des cas devra être affiché (ou restitué sous une forme ou une autre) en passant la main à la vue.

12.6.3.2.Implémentation

La classe contrôleur est une classe qui, le plus souvent, hérite de Zend\Mvc\Controller\AbstractActionController.
Dans l'exemple fourni dans le chapitre sur le routage, l'action appelée était désignée par "monTest" (qui renvoit à la méthode "monTestAction") et le contrôleur baptisé "TestController".
<?php
namespace PHPFacile\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class TestController extends AbstractActionController
{
    public function monTestAction()
    {
        die('A compléter');
    }
}
rem
  • Libre à vous de choisir l'espace de nom de votre application (dans l'exemple nous avons choisi PHPFacile). Nous avons également choisi de regrouper les contrôleurs dans un dossier et espace de nom Controller. Nous avons donc choisi un espace de nom complet PHPFacile\Controller.
  • Dans cet exemple, le contrôleur s'appelle TestController (comme ce que nous avions déclaré dans le fichier de routage). A vous d'adapter.
  • Dans cet exemple, le contrôleur ne contient qu'une seule action, définie par la méthode "monTestAction()" en cohérence, là aussi, avec le fichier de routage qui fait référence à l'action "monTest".
  • Dans cet exemple, le "passage de témoin" à la vue a été court-circuité par l'instruction die().
Si vous respectez l'arborescence proposée par le squelette d'application Zend, vous aurez une arborescence semblable à:
  • config
  • module
    • PHPFacile
      • config
        • module.config.php
      • src
        • Controller
          • TestController.php
        • Model
      • view
  • config
  • module
    • PHPFacile
      • config
        • module.config.php
      • src
        • PHPFacile
          • Controller
            • TestController.php
          • Model
      • view

12.6.3.3.Passage à la vue

Généralement, à l'issue du traitement de la demande par le contrôleur, celui-ci rend la main à la vue qui sera en charge de formatter les données. La plupart du temps, dans le cas d'une application web, il s'agit de générer du code HTML (i.e. afficher une page dans le navigateur) mais il peut également s'agir de générer une chaîne JSON (dans le cadre d'un appel Ajax par exemple), de générer un document PDF, etc.
Ce transfert des données entre le contrôleur et la vue se fait par l'intermédiaire de l'instruction return à la fin de l'action. Comme dans l'exemple suivant:
<?php
namespace PHPFacile\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class TestController extends AbstractActionController
{
    public function monTestAction()
    {
        // Tableau des données à passer à la vue
        return array('variable' => 'valeur');
    }
}
Dans la pratique, nous préférerons retourner un objet de type ViewModel (ou du genre) plutôt qu'un simple tableau mais nous vous expliquons tout cela en détail dans le chapitre suivant.

12.6.3.4.Initialisation

Depuis Zend Framework 2, il n'est plus question de faire appel à une fonction init() pour initialiser le contrôleur. A la place, l'initialisation doit se faire au niveau du constructeur du contrôleur. Il est donc possible de faire comme suit
<?php
namespace PHPFacile\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class TestController extends AbstractActionController
{
    protected $maVariable = null;

    public function __construct()
    {
        $this->maVariable = 'initialisation par le constructeur';
    }

    public function monTestAction()
    {
        // Tableau des données à passer à la vue
        return array('variable' => $this->maVariable);
    }
}
rem
  • Au niveau du constructeur, il ne sera pas possible d'accéder simplement à la configuration de l'application
  • Au niveau des méthodes du contrôleur, le tableau contenant toute la configuration de l'application pourra être récupéré via un appel à $this->getServiceLocator()->get('Config') mais en pratique, pour un logiciel bien architecturé, ce n'est pas tellement au niveau des méthodes du contrôleur que cela doit être fait mais au niveau des services ou des "factories" comme nous le verrons par la suite
A dire vrai, ce n'est pas tellement ce cas de figure qui nous intéresse. En pratique, l'initialisation s'appuiera surtout sur des paramètres passés à l'instanciation du contrôleur, comme dans le paragraphe suivant.