Framework Zend - Routage

Cartes de routage Request URIà la méthode d'un contrôleur spécifique. Dans ce chapitre, nous verrons comment implémenter les routes dans un Framework Zend.

En général, tout URI comporte trois parties -

  • Segment de nom d'hôte,
  • Segment de chemin, et
  • Segment de requête.

Par exemple, dans URI / URL - http://www.example.com/index?q=data, www.example.com est le segment de nom d'hôte, index est le segment de chemin et q=dataest le segment de requête. Généralement, le routage vérifie lePage segmentcontre un ensemble de contraintes. Si une contrainte correspond, elle renvoie un ensemble de valeurs. L'une des principales valeurs est le contrôleur.

Le routage vérifie également le segment hôte, le segment de requête, les méthodes HTTP de requête, les en-têtes HTTP de requête, etc., dans une certaine situation.

Route et RouteStack

La route est le principal objet du routage. Zend Framework a une interface spéciale pour l'objet route,RouteInterface. Tout objet route doit implémenter RouteInterface. La liste complète de RouteInterface est la suivante -

namespace Zend\Mvc\Router;  
use Zend\Stdlib\RequestInterface as Request;  
interface RouteInterface { 
   public static function factory(array $options = []); public function match(Request $request); 
   public function assemble(array $params = [], array $options = []); 
}

La méthode principale est match. Cette méthode de correspondance vérifie la demande donnée par rapport à la contrainte qui y est définie. Si une correspondance est trouvée, elle renvoie leRouteMatchobjet. Cet objet RouteMatch fournit les détails de la demande correspondante en tant que paramètres. Ces paramètres peuvent être extraits deRouteObject en utilisant le getParams méthode.

La liste complète de RouteObject est la suivante -

namespace Zend\Mvc\Router;  
class RouteMatch { 
   public function __construct(array $params); public function setMatchedRouteName($name); 
   public function getMatchedRouteName(); 
   public function setParam($name, $value); 
   public function getParams(); 
   public function getParam($name, $default = null); 
}

En général, une application MVC typique a de nombreuses routes. Chacun de ces itinéraires sera traité dans l'ordre LIFO et un seul itinéraire sera mis en correspondance et retourné. Si aucune route n'est mise en correspondance / renvoyée, l'application renvoie l'erreur «Page non trouvée». Zend Framework fournit une interface pour traiter les routes,RouteStackInterface. Cette RouteStackInterface a la possibilité d'ajouter / supprimer des routes.

La liste complète de RouteStackInterface est la suivante -

namespace Zend\Mvc\Router;  
interface RouteStackInterface extends RouteInterface { 
   public function addRoute($name, $route, $priority = null); public function addRoutes(array $routes); 
   public function removeRoute($name); public function setRoutes(array $routes); 
}

Le framework Zend fournit deux implémentations du RouteStack interface et ils sont comme suit -

  • SimpleRouteStack
  • TreeRouteStack

Type d'itinéraires

Le framework Zend fournit de nombreux objets route prêts à l'emploi pour toutes les situations sous l'espace de noms "Zend \ Mvc \ Router \ Http". Il suffit de sélectionner et d'utiliser l'objet d'itinéraire approprié pour la situation donnée.

Les itinéraires disponibles sont les suivants -

  • Hostname - Utilisé pour faire correspondre la partie hôte de l'URI.

  • Literal - Utilisé pour correspondre à l'URI exact.

  • Method - Utilisé pour correspondre à la méthode HTTP de la requête entrante.

  • Part - Utilisé pour faire correspondre la partie du segment de chemin URI à l'aide d'une logique personnalisée.

  • Regex - Utilisé pour faire correspondre le segment de chemin URI par modèle Regex.

  • Schema - Utilisé pour correspondre au schéma URI tel que http, https, etc.

  • Segment - Utilisé pour faire correspondre le chemin URI en le divisant en plusieurs segments.

Voyons comment écrire la Route littérale et segmentée la plus couramment utilisée. Les routes sont généralement spécifiées dans le fichier de configuration de chaque module -module.config.php.

Route littérale

En règle générale, les itinéraires sont interrogés dans un ordre LIFO. La route littérale sert à faire la correspondance exacte du chemin URI.

Il est défini comme indiqué ci-dessous -

$route = Literal::factory(array( 
   'route' => '/path', 
   'defaults' => array('controller' => 'Application\Controller\IndexController', 
      'action' => 'index',), 
));

L'itinéraire ci-dessus correspond au /path dans l'url de la demande et renvoie index comme le action et IndexController en tant que contrôleur.

Route de segment

Une route segmentée est utilisée chaque fois que votre URL est censée contenir des paramètres variables.

Il est décrit comme indiqué ci-dessous -

$route = Segment::factory(array( 
   'route' => '/:controller[/:action]', 
   'constraints' => array( 
      'controller' => '[a-zA-Z][a-zA-Z0-9_-]+', 
      'action' => '[a-zA-Z][a-zA-Z0-9_-]+', 
   ), 
   'defaults' => array( 
      'controller' => 'Application\Controller\IndexController', 
      'action' => 'index',), 
));

Ici, les segments sont indiqués par deux-points et suivis de caractères alphanumériques. Si vous gardez un segment facultatif, il est entouré de crochets. Chaque segment peut être associé à des contraintes. Chaque contrainte est une expression régulière.

Configuration de la route dans le module du didacticiel

Ajoutons une route de segment dans notre module Tutoriel. Mettre à jour le fichier de configuration du module du didacticiel -module.config.php disponible à myapp/module/Tutorial/config.

<?php  
namespace Tutorial;  
use Zend\ServiceManager\Factory\InvokableFactory; 
use Zend\Router\Http\Segment;  
return [ 
   'controllers' => [ 
      'factories' => [ 
         Controller\TutorialController::class => InvokableFactory::class, 
      ], 
   ], 
   'router' => [ 
      'routes' => [ 
         'tutorial' => [ 
            'type'    => Segment::class, 
               'options' => [ 
                  'route' => '/tutorial[/:action[/:id]]', 
                  'constraints' => [ 
                     'action' => '[a-zA-Z][a-zA-Z0-9_-]*', 
                     'id'     => '[0-9]+', 
                  ], 
                  'defaults' => [
                     'controller' => Controller\TutorialController::class, 
                     'action'     => 'index', 
                  ], 
               ], 
            ], 
      ], 
   ], 
   'view_manager' => [ 
      'template_path_stack' => ['tutorial' => __DIR__ . '/../view',], 
   ], 
];

Nous avons ajouté avec succès le routage pour notre Tutorialmodule. Nous n'avons qu'une longueur de retard dans la réalisation de notre module Tutoriel. Nous devons ajouterView pour notre module, que nous apprendrons dans le chapitre suivant.