13.Zend Framework 2 et 3

13.5.Routage

13.5.1.Introduction

Dans les chapitres précédents nous avons vu comment configurer[comment?] le serveur web pour que l'ensemble des requêtes (non directement associées à une ressource dans l'espace publique) soient redirigées vers un seul et unique script l'amorce ou bootstrap (baptisé index.php et à la racine du site dans la configuration proposée par Zend Framework). Nous avons dit que c'est ce script qui est ensuite chargé de transmettre la demande au bon "service" par routage. C'est ce processus que nous allons décrire dans ce tutoriel.
Comme dans le chapitre précédent, nous nous appuierons sur l'arborescence et les fichiers de configuration proposés par le squelette d'application Zend (ZendSkeletonApplication que nous abrègerons en ZSA). Celui-ci sert en effet de référence et propose un standard de facto. Standard qui toutefois évolue d'une version à l'autre et qui nous oblige donc à vous présenter quelques variantes.

13.5.2.Routage dans module.config.php

Que fait donc ce script d'amorçage? En premier lieu il prépare l'environnement (inclusion du ou des autoloaders[c'est quoi?], chargement des fichiers de configuration, etc) puis il s'intéresse à la fois à l'URL saisie et à un fichier de configuration en particulier module.config.php du module principal de l'application.
Ce fichier de configuration retourne un tableau contenant notamment une clé router qui liste l'ensemble des routes possibles pour rediriger le traitement vers un module donné si une des règles déclarées pour ces routes correspond à l'URL saisie.
Pour être plus précis, en fonction de l'URL saisie et sur la base du contenu de ce fichier, l'application va exécuter telle ou telle action de tel ou tel contrôleur. Un contrôleur c'est simplement une classe en charge d'une ou plusieurs actions (i.e. un ou plusieurs traitements). Dans la logique Zend Framework, une action est une méthode de la classe contrôleur dont par défaut le nom se termine par Action. Pour le nom de la classe on choisit généralement un nom se terminant par Controller.
On peut ainsi avoir
<?php
namespace PHPFacile;

use Zend\Router\Http\Literal;
use Zend\ServiceManager\Factory\InvokableFactory;

// Extrait d'un fichier module.config.php limité aux clés "router" et "controllers"
return [
  'router' => [
    'routes' => [
      'route_test' => [
        'type' => Literal::class,
        'options' => [
          'route' => '/ma_route/de/test',
          'defaults' => array(
            'controller' => Controller\TestController::class,
            'action'     => 'monTest',
          )
        )
      )
    )
  ),
  'controllers' => array(
    'factories' => array(
      Controller\TestController::class => InvokableFactory::class,
    ),
  ),
  // Suite de la configuration (masquée)
);
Dans ce cas, on a déclaré que lorsque l'on demande la ressource /ma_route/de/test (champ "route"), autrement dit lorsque l'on saisit l'URL <protocole>://<domaine>:<port>/ma_route/de/test (ex: http://localhost/ma_route/de/test) c'est la méthode monTestAction (champ "action" auquel on ajoute "Action") du contrôleur Controller\TestController dans l'espace de nom PHPFacile (autrement dit le contrôleur PHPFacile\Controller\TestController) qui doit être appelé. La façon dont doit être instancié le contrôleur est précisé dans la partie controllers de la configuration, comme nous le verrons par la suite.
<?php
namespace PHPFacile;

// Extrait d'un fichier module.config.php limité aux clés "router" et "controllers"
return array(
  'router' => array(
    'routes' => array(
      'route_test' => array(
        'type' => 'Literal',
        'options' => array(
          'route' => '/ma_route/de/test',
          'defaults' => array(
            'controller' => 'PHPFacile\Controller\Test',
            'action'     => 'monTest',
          )
        )
      )
    )
  ),
  'controllers' => array(
    'invokables' => array(
      'PHPFacile\Controller\Test' => Controller\TestController::class
    ),
  ),
  // Suite de la configuration (masquée)
);
Dans ce cas, on a déclaré que lorsque l'on demande la ressource /ma_route/de/test (champ "route"), autrement dit lorsque l'on saisit l'URL <protocole>://<domaine>:<port>/ma_route/de/test (ex: http://localhost/ma_route/de/test) c'est la méthode monTestAction (champ "action" auquel on ajoute "Action") du contrôleur dont l'alias (à retrouver dans la partie "controllers" de la configuration) est PHPFacile\Controller\Test qui doit être appelée. En l'occurrence comme c'est le contrôleur Controller\TestController de l'espace de nom PHPFacile qui est associé à cet alias, c'est le contrôleur PHPFacile\Controller\TestController qui est appelé.
<?php
// Extrait d'un fichier module.config.php limité aux clés "router" et "controllers"
return array(
  'router' => array(
    'routes' => array(
      'route_test' => array(
        'type' => 'Literal',
        'options' => array(
          'route' => '/ma_route/de/test',
          'defaults' => array(
            'controller' => 'PHPFacile\Controller\Test',
            'action'     => 'monTest',
          )
        )
      )
    )
  ),
  'controllers' => array(
    'invokables' => array(
      'PHPFacile\Controller\Test' => 'PHPFacile\Controller\TestController'
    ),
  ),
  // Suite de la configuration (masquée)
);
Dans ce cas, on a déclaré que lorsque l'on demande la ressource /ma_route/de/test (champ "route"), autrement dit lorsque l'on saisit l'URL <protocole>://<domaine>:<port>/ma_route/de/test (ex: http://localhost/ma_route/de/test) c'est la méthode monTestAction (champ "action" auquel on ajoute "Action") du contrôleur dont l'alias (à retrouver dans la partie "controllers" de la configuration) est PHPFacile\Controller\Test qui doit être appelée. En l'occurrence comme c'est le contrôleur PHPFacile\Controller\TestController qui est associé à cet alias, c'est ce contrôleur qui est appelé.