Blog développeur

« Etudie, non pour savoir plus, mais pour savoir mieux. »

Zend Framework

Faire de l'URL Rewriting

Par Guillaume Sarramegna, le 6 oct. 2011

Nouvel article (oui ! déjà !) qui, cette fois, traite de l'URL Rewriting avec Zend Framework.

Pour la petite histoire, qu'est ce que l'URL rewriting ?

L’URL rewriting permet de réécrire des URL complexes de façon simplifiée et est notamment utilisé pour le référencement.

En effet, des liens plus simples facilitent le travail des robots d'indexation et évitent les erreurs de saisie des visiteurs (suppression des accents et autres caractère spéciaux). Elle permet aussi de sécuriser l'accès à ses pages en masquant les noms de variables passées dans l’URL.

On va donc voir comment mettre en place l'URL rewriting avec Zend Framework (ce qu'on pourrait aussi bien faire avec un .htaccess mais bon, Zend c'est cool) et ceci, en 3 parties : le bootstrap, la réécriture d'URL dans la vue et le fichier INI.

Le bootstrap :

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {

	protected function _initRouter() {
		$front = $this->bootstrap('FrontController')->getResource('FrontController'); // On récupère le frontController
		$config = new Zend_Config_Ini(APPLICATION_PATH . '/configs/application.ini', 'production'); // On récupère la config (avec les paramètres de routage)
		$routing = new Zend_Controller_Router_Rewrite(); // On instancie notre objet de routage
		$routing->addConfig($config, 'routes'); // On le configure
		$front->setRouter($routing); // Et on mélange le tout
	}
}

Plein la vue :

<?php echo $this->url(array('id' => $idArticle, 'name' => $titreArticle), 'article', true); ?>

Pour afficher le lien, on passe en premier paramètre un tableau correspondant à nos variables (cf la dernière ligne du fichier INI), en second, le nom de la route, et en dernier on spécifie que les paramètres de la page en cours sont à ignorer.

Le fichier INI :

[production]
routes.article.type = "Zend_Controller_Router_Route_Regex" ;Le type de routage
routes.article.route = "article/(\d+)-(\w+).html" ;La regex qui correspond à l'URL à router
routes.article.defaults.controller = "article" ;Le contrôleur vers lequel on route l'URL
routes.article.defaults.action = "voir" ;L'action vers lequel on route l'URL
routes.article.map.1 = "id" ;Le nom du paramètre correspondant à la première paire de parenthèses
routes.article.map.2 = "name" ;Le nom du paramètre correspondant à la deuxième paire de parenthèses
routes.article.reverse ="article/%d-%s" ;Ce qui va nous permettre de faire l'opération inverse en donnant l'id de l'article ainsi que son nom

Le tour est joué.

Je précise deux points que je n'ai pas traité plus haut :

  1. Pour éviter des conflits avec les autres appels de l'aide de vue "url", il convient de passer la valeur 'default' en second paramètre de celle-ci pour ne pas utiliser la route de la page en cours.
  2. Il convient aussi de supprimer les caractères du nom de l'article qui ne seraient pas compatibles avec la classe [A-Za-z_] (correspondant à \w)

A bientôt !

0 commentaire

Votre commentaire