Routeur StandardIntroductionZend_Controller_Router_Rewrite est le routeur par défaut du framework. Le routage consiste à analyser l'URI définie (la partie après l'URL de base) et la décomposer en valeurs déterminant quels module, contrôleur et action doivent recevoir la requête. Ces valeurs sont encapsulées dans un objet de requête Zend_Controller_Request_Http qui est alors injecté dans Zend_Controller_Dispatcher_Standard pour y être traité Le routage n'est effectué qu'une seule fois par requête : juste avant que le premier contrôleur ne soit traité (distribué) Zend_Controller_Router_Rewrite intervient pour fournir un environnement de requête similaire à "mod_rewrite", tout en utilisant uniquement du PHP. Il est désigné sur les principes de Ruby on Rails et ne requière pas de connaissances particulières en réécriture d'URL. Il est destiné à fonctionner avec une seule règle de réécriture Apache, dont voici des exemples :
ou (recommandé) :
Le routeur de réécriture peut aussi être utilisé avec un serveur Web IIS (versions <= 7.0) si » Isapi_Rewrite a été installée comme une extension Isap avec la règle suivante :
IIS 7.0 introduit un moodule de réécriture d'URL natif, et il peut être configuré comme ceci :
Si vous utilisez Lighttpd, la règle de réécriture suivante est valide :
Utilisation d'un routeurPour utiliser un routeur et le configurer, vous devez le récupérer et ajouter des routes :
Utilisation basique du routeur de réécritureLe coeur de ce routeur repose sur le concept de routes personnalisées. Les routes sont ajoutées en appelant la méthode addRoute() et en lui passant une instance implémentant Zend_Controller_Router_Route_Interface. Exemple :
Le routeur de réécriture est fourni avec six types de route, dont une spéciale : Chaque route peut être utilisée plusieurs fois pour créer un chaîne de routes représentant un schéma de routage personnalisé. La route du module, en revanche, ne devrait être utilisée qu'une seule fois, elle est en générale la route la plus générique (par défaut). Chaque route sera définie un peu plus tard.
Le premier paramètre de
Le routage consiste simplement à itérer toutes les routes reçues et à les faire correspondre à l'URI de la requête courante. Dès qu'une correspondance est établie, les variables sont injectées dans l'objet Zend_Controller_Request utilisé après dans le distributeur et dans les contrôleurs. Si aucune correspondance n'est trouvée, la route suivante dans la pile est analysée. Si vous devez déterminer quelle route a été trouvée, vous pouvez utilisez la méthode getCurrentRouteName(), qui vous retournera l'identifiant utilisé pour enregistrer la route dans le routeur. Si vous souhaitez récupérer l'objet de la route actuelle, vous pouvez utiliser getCurrentRoute().
Il y a trois valeurs spéciales qui peuvent être utilisées dans la définition de vos routes : - "module", "controller" et "action" -. Ces valeurs sont utilisées par Zend_Controller_Dispatcher pour trouver les contrôleurs et action à distribuer.
Routes par défaut
Zend_Controller_Router_Rewrite possède des routes par défaut qui vont
correspondre pour des URI du type Exemples avec ces routes :
La route par défaut est simplement un objet Zend_Controller_Router_Route_Module, stocké sous le nom "default" dans le routeur de réécriture(RewriteRouter). Il est conçu comme ceci :
Si vous ne souhaitez pas cette route par défaut, créez en une et stocker la avec le nom "default" (écrasement), ou supprimez la route avec removeDefaultRoutes() :
Base URL et sous dossiers
Le routeur de réécriture peut être utilisé dans des sous dossiers (comme
Si ça n'était pas le cas, vous pouvez spécifier votre propre base URL dans Zend_Controller_Request_Http en appelant setBaseUrl() (voyez Base de l'URL et sous-dossiers) :
Paramètres globauxVous pouvez régler des paramètres globaux dans un routeur, qui sont automatiquement fournis à la route lors de son assemblage, grâce à la fonction setGlobalParam(). Si un paramètre global est réglé mais qu'il est aussi fourni directement à la méthode d'assemblage, le paramètre utilisateur écrase le paramètre global. Vous pouvez régler un paramètre global de cette manière :
Types de routeZend_Controller_Router_RouteZend_Controller_Router_Route est la route par défaut intégrée dans le routeur de réécriture (RewriteRouter). Ce routeur combine les deux avantages que sont la simplicité d'utilisation et la flexibilité. Chaque route est définie par une correspondance d'URL, statique ou dynamique, et des valeurs par défaut peuvent être fournies, de même que des valeurs obligatoires. Imaginons une application ayant besoin de posséder une page en décrivant l'auteur. Nous voulons que lorsque le navigateur pointe vers http://domaine.fr/auteur/martel, la page d'informations en question puisse apparaître, au sujet de "martel". La route pour une telle URL pourrait être :
Le premier paramètre du constructeur de Zend_Controller_Router_Route est la définition de la route à analyser avec l'URL. Les définitions des routes sont des parties statiques et dynamiques, séparées par des slashs ("/"). Les parties statiques sont juste du texte brut : auteur. Les dynamiques, appelées variables, sont repérées grâce à un caractère deux-points (:) devant la variable : :username.
Cette route exemple devrait être utilisée lorsque le navigateur pointe vers http://domaine.fr/auteur/martel, et dans un tel cas, tous les paramètres de la requête seront injectés dans l'objet Zend_Controller_Request et seront accessibles à travers votre ProfileController. Les variables retournées par cet exemple peuvent être représentées par le tableau suivant :
Plus tard, Zend_Controller_Dispatcher_Standard va distribuer vers la méthode userinfoAction() de ProfileController (dans le module par défaut) selon ces valeurs. A cet endroit, il sera possible d'accéder à toutes les variables de la requête grâce à Zend_Controller_Action::_getParam() ou Zend_Controller_Request::getParam() :
La définition des routes peut contenir un ou plusieurs caractères spéciaux - des jokers - représentés par le symbole '*'. Il est utilisé pour collecter des paramètres. L'exemple suivant représente plus ou moins le comportement par défaut de la route "Module" :
Variables par défautChaque variable dynamique dans la définition des routes peut avoir une valeur par défaut. C'est à cela que sert le second paramètre du constructeur de Zend_Controller_Router_Route. Il s'agit d'un tableau avec comme clés les noms des variables, et comme valeurs, leurs valeurs par défaut :
L'exemple ci-dessus établira une correspondance avec les URL comme http://domaine.fr/archive/2005 et http://exemple.fr/archive. Dans ce dernier cas, la variable de l'année (annee) aura la valeur 2006. L'exemple ci-dessus injecte ainsi un paramètre représentant une année (annee). Si aucune information de contrôleur ou d'actions n'est présente, alors ceux par défaut seront utilisés (ils sont définis dans Zend_Controller_Dispatcher_Abstract). Pour que l'exemple soit plus intuitif, spécifions des paires contrôleur et action par défaut dans notre route :
Cette route va alors donner une distribution vers la méthode showAction() de ArchiveController. Obligations et contraintes des variablesVous pouvez ajouter un troisième paramètre au constructeur de Zend_Controller_Router_Route pour spécifier une variable obligatoire. Ceci s'effectue au moyen d'expressions régulières : Avec une telle définition de route, comme ci-dessus, le routeur n'établira une correspondance que si la variable "annee" contient une donnée numérique : http://domaine.fr/archive/2345. Une URL comme http://exemple.annee/archive/test ne sera pas captée (matchée) par cette route, et le contrôle sera passé à la route suivante, etc. Zend_Controller_Router_Route_StaticLes exemples ci-dessus utilisent des routes dynamiques - routes qui contiennent des motifs pour chercher des correspondances. Seulement, parfois, une route particulière est marquée en dur, et mettre en marche le moteur d'expression régulière serait inutile. La réponse à cette situation est l'utilisation de routes statiques :
La route ci-dessus correspond à l'URL http://domain.com/login, et distribue l'action AuthController::loginAction().
Zend_Controller_Router_Route_RegexEn plus des routes par défaut, et statique, les routes exprimées par expression régulière sont acceptées. Ces routes sont plus puissantes que les autres, mais aussi plus complexes à mettre en oeuvre et un peu plus lentes en matière d'analyse. Comme les routes standards, cette route doit être initialisée avec une définition et des valeurs par défaut. Créons par exemple avec une route "archive" en utilisant les routes par expressions régulières :
Chaque motif d'expression régulière sera injecté dans l'objet de requête. Avec
l'exemple ci-dessus, en utilisant
Vous pouvez retourner le contenu des sous-masques :
Cette route ne fonctionnera pas encore tout à fait comme la route standard, car la
valeur par défaut pour "
Nous voyons apparaître tout de même un problème : gérer des chiffres, comme clés pour les paramètres n'est pas très intuitif. C'est là qu'entre en jeu le troisième paramètre du constructeur de Zend_Controller_Router_Route_Regex. Il accepte un tableau faisant correspondre les numéros des paramètres et leur nom respectif : Les valeurs suivantes seront injectées dans l'objet de requête :
Il est aussi possible d'inverser les clé et valeurs du tableau :
Si vous inversez comme dans le deuxième cas de l'exemple ci-dessus, la clé alors reçue par l'objet de requête ne représente plus un chiffre, mais le nom du paramètre. Vous pouvez évidemment mixer les comportements :
Si nous appelons l'URL
Étant donné que les route par expression régulière ne sont pas facilement réversible, vous devrez préparer le motif vous-même dans le but d'utiliser l'aide de vue "url". Ce chemin inverse doit être défini comme une chaîne traitable par la fonction sprintf() de PHP, et définie en quatrième paramètre du constructeur de la route Regex :
Quels sont donc les avantages des routes par expressions régulières (Regex) ? C'est
que vous pouvez décrire n'importe quelle URL avec. Imaginez un blog, vous voulez créer des
URLs du type Comme vous le voyez, ce type de route ajoute une solution flexible concernant la gestion des URLs et leur routage. Zend_Controller_Router_Route_HostnameZend_Controller_Router_Route_Hostname est la route par nom d'hôte du framework. Elle fonctionne de la même manière que la route standard, mais elle utilise le nom d'hôte de l'URL appelé au lieu du chemin.
Utilisons l'exemple d'une route standard et regardons ce que cela donnerais en
utilisant le nom d'hôte. Au lieu d'appeler l'utilisateur par le chemin, nous voulons être
capable d'appeler
Le premier paramètre dans le constructeur
Zend_Controller_Router_Route_Hostname est la définition d'une route
qui correspondra à un nom d'hôte. Les définitions de route consistent en des parties
statiques et des parties dynamiques séparées par le caractère point ("
Les routes par nom d'hôtes peuvent, mais ne devraient pas être utilisées comme ceci.
La raison à cela est que qu'une route par nom d'hôte seule ne correspondra à aucun chemin.
Donc vous devez donc chaîner le chemin d'une route à une route par nom d'hôte. Ceci est
réalisé comme dans l'exemple ci-dessous en appelant
Zend_Controller_Router_Route_ChainZend_Controller_Router_Route_Chain est une route permettant le chainage d'autres routes. Ceci permet de chainer des routes hostnames à des routes de chemin, ou de multiples routes de chemin entre elles, par exemple. Le chainage se configure via des méthodes ou un fichier de configuration.
En réalisant le chainage via les méthodes, il existe 2 manières de procéder. La première est de créer un objet Zend_Controller_Router_Route_Chain puis d'appeler la méthode chain() plusieurs fois en lui passant les routes à chainer. La deuxième méthode consiste à créer la première route, par exemple une route hostname, puis d'appeler sa méthode chain() en passant comme paramètre la route qui devrait être ajoutée. Ceci ne modifiera pas la route hostname, mais retournera une instance de Zend_Controller_Router_Route_Chain possédant les 2 routes chainées:
Le chainage utilise le slash comme séparateur par défaut entre les routes. Pour utiliser un séparateur différent, procédez comme suite:
Chainer des routes via Zend_Config
Pour chainer les route grâce à un fichier de configuration, il faut considérer des paramètres
additionnels. L'approche la plus simple consiste à utiliser les paramètres de la
section
Le résultat sera 3 routes Autre manière de faire : utiliser les nom des routes directement. Cela ne peut se faire que pour le niveau racine:
On peut aussi passer un tableau à
Pour spécifier le séparateur de routes avec Zend_Config , agissez comme suit:
Zend_Rest_RouteLe composant Zend_Rest contient une route RESTful pour Zend_Controller_Router_Rewrite. Cette route permet un schéma de routage fonction de la méthode HTTP et de l'URI afin d'y faire correspondre un module, contrôleur, et action. Le tableau suivant vous donne un aperçu du schéma de routage en fonction de l'URI.
Utilisation de Zend_Rest_RoutePour activer Zend_Rest_Route pour une application entière, construisez en un objet sans paramètre spécifique et ajoutez le comme route par défaut dans le contrôleur frontal:
Pour activer Zend_Rest_Route pour des modules spécifiques, construisez l'objet avec comme troisième paramètre, un tableau de noms de modules : Pour activer Zend_Rest_Route pour des contrôleurs spécifiques, construisez l'objet avec comme troisième paramètre, un tableau de noms de contrôleurs en correspondance avec des noms de modules. Zend_Rest_Route avec Zend_Config_IniTo use Zend_Rest_Route from an INI config file, use a route type parameter and set the config options:
The 'type' option designates the RESTful routing config type. The 'defaults' option is used to specify custom default module, controller, and/or actions for the route. All other options in the config group are treated as RESTful module names, and their values are RESTful controller names. The example config defines Mod_ProjectController and Mod_UserController as RESTful controllers. Then use the addConfig() method of the Rewrite router object:
Zend_Rest_ControllerPour vous aidez à utiliser des contrôleurs avec Zend_Rest_Route, faites les étendre Zend_Rest_Controller. Zend_Rest_Controller définit les 5 opérations RESTful les plus connues sous forme de méthodes abstraites.
Utiliser Zend_Config avec le RewriteRouterIl arrive qu'il soit plus commode d'éditer un fichier de configuration de routes, plutôt que d'éditer un code source. Ceci est rendu possible par la méthode addConfig(). Vous créez un objet compatible Zend_Config et vous le passez à cette méthode. Par exemple, voyons un fichier INI :
Ce fichier INI peut être lu dans grâce à un objet Zend_Config comme suit :
Nous indiquons au routeur d'utiliser la section "routes" du fichier INI. Chaque clé de premier niveau représente le nom de la route, ainsi nous avons dans l'exemple ci dessus "archive" et "news". Chaque route attend alors au moins une entrée "route" avec une ou plusieurs entrées "defaults" ; optionnellement nous pouvons rajouter des paramètres obligatoires. Tout ceci correspond aux trois arguments fournis par l'objet implémentant Zend_Controller_Router_Route_Interface. Une entrée optionnelle "type" peut être utilisée pour indiquer le type de classe de routage à utiliser, il s'agit par défaut de Zend_Controller_Router_Route. Dans l'exemple au dessus, la route "news" va utiliser Zend_Controller_Router_Route_Static. Dérivation de l'objet RouterLe routeur par défaut, dit de réécriture, devrait suffire dans la majorité des projets. Tout ce qu'il peut être nécessaire de faire, est d'ajouter des routes particulières selon vos besoins. Cependant, si vous voulez utiliser votre propre logique de routage, une interface est disponible. Zend_Controller_Router_Interface ne définit qu'une seule méthode :
Le processus de routage n'intervient qu'une fois : lorsque la requête est reçue par le système. Le routeur doit alors déterminer un contrôleur, une action et de paramètres optionnel et les spécifier dans un objet de requête, qui est ensuite passé au distributeur. Si il n'est pas possible de router une requête, alors l'objet de requête devrait être laissé tel-quel.
|
|