Utilisation de Zend_Controller_Router_Rewrite

  • Auteur de la discussion Auteur de la discussion neo765
  • Date de début Date de début
WRInaute discret
Salut,

J'ai essayé de faire ma réécriture d'URL avec Zend_Controller_Router_Rewrite mais quelque chose semble bloquer :

J'aimerai réécrire l'URL http://www.ndd.dev/interet/index/id/1/ pour http://www.ndd.dev/i/rouen/1/

Pour cela j'ai ajouté dans mon bootstrap :

Code:
protected function _initRouter () {
	
		$config = new Zend_Config_Ini(APPLICATION_PATH.'/config/application.ini', APPLICATION_ENV);
		$router = new Zend_Controller_Router_Rewrite();
		$router->addConfig($config, 'routes');
	
}
et dans mon application.ini :

[production]
[...]
routes.interet.type = "Zend_Controller_Router_Route_Regex"
routes.interet.route = "/i/(.+)/([0-9]+)/"
routes.interet.defaults.controller = "interet"
routes.interet.defaults.action = "index"
routes.interet.map.1 = "seo"
routes.interet.map.2 = "id"
routes.interet.reverse ="i/%s/%d/"
Et mon .htaccess est le suivant :

RewriteEngine On

RewriteBase /
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule !\.(js|ico|gif|jpg|png|css)$ /index.php
Mais j'obtiens le message d'erreur suivant :

Fatal error: Uncaught exception 'Zend_Controller_Dispatcher_Exception' with message 'Invalid controller specified (error)' in /www/library/Zend/Controller/Dispatcher/Standard.php:248 Stack trace: #0 /www/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 /www/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller_Front->dispatch() #2 /www/htdocs/xxx/application/Bootstrap.php(8): Zend_Application_Bootstrap_Bootstrap->run() #3 /www/library/Zend/Application.php(366): Bootstrap->run() #4 /www/htdocs/xxx/html/index.php(15): Zend_Application->run() #5 {main} Next exception 'Zend_Controller_Exception' with message 'Invalid controller specified (error)#0 /www/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http)) #1 /www/library/Zend/Application/Bootstrap/Bootstrap.php(97): Zend_Controller in /www/library/Zend/Controller/Plugin/Broker.php on line 336
L'accès depuis http://www.ndd.dev/interet/index/id/1/ reste lui toujours disponible.

Merci
 
WRInaute impliqué
Quand une erreur se produit, Zend redirige vers le controller Error. Vérifie qu'il soit bien quelque part.
 
WRInaute discret
En effet, les messages d'erreur sont plus clair maintenant !

J'obtiens le message d'erreur :

DEBUG INFOS :
Exception de type: Zend_Controller_Dispatcher_Exception
Invalid controller specified (i)
envoyée dans /www/library/Zend/Controller/Dispatcher/Standard.php à la ligne 248
 
WRInaute discret
Oui je pense aussi vu qu'il essaye de me charger le contrôler "i".

J'ai beau rechercher dans la doc technique je ne trouve pas la réponse.

J'ai essayé en utilisant d'autres méthodes mais la doc reste flou... notamment avec :

Code:
/* Créer un routeur */
$router = $frontctrl->getRouter();
// retourne un routeur de réécriture par défaut
$router->addRoute(
    'user',
    new Zend_Controller_Router_Route('user/:username',
                                     array('controller' => 'user',
                                           'action' => 'info'))
);

sur http://framework.zend.com/manual/1.12/fr/zend.controller.router.html#z ... utes.regex

et je ne sais pas d'où vient leur variable $frontctrl...
 
WRInaute discret
Même avec cette configuration il n'y a pas de redirection :

Code:
$router = Zend_Controller_Front::getInstance()->getRouter();

$r = new Zend_Controller_Router_Route_Regex(
	"i/([-\w]+)/(\d+)/",
	array('controller' => 'interet', 'action' => 'index'), 
	array(1 => 'seo', 2 => 'id'),
	'i/%s/%d/'
);

$router->addRoute('interet', $r);
var_dump($router);
return $router;

le var_dump() me retourne :

object(Zend_Controller_Router_Rewrite)#6 (8) { ["_useDefaultRoutes":protected]=> bool(true) ["_routes":protected]=> array(1) { ["interet"]=> object(Zend_Controller_Router_Route_Regex)#8 (7) { ["_regex":protected]=> string(17) "i/([-\w]+)/(\d+)/" ["_defaults":protected]=> array(2) { ["controller"]=> string(7) "interet" ["action"]=> string(5) "index" } ["_reverse":protected]=> string(8) "i/%s/%d/" ["_map":protected]=> array(2) { [1]=> string(3) "seo" [2]=> string(2) "id" } ["_values":protected]=> array(0) { } ["_isAbstract":protected]=> bool(false) ["_matchedPath":protected]=> NULL } } ["_currentRoute":protected]=> NULL ["_globalParams":protected]=> array(0) { } ["_chainNameSeparator":protected]=> string(1) "-" ["_useCurrentParamsAsGlobal":protected]=> bool(false) ["_frontController":protected]=> object(Zend_Controller_Front)#11 (11) { ["_baseUrl":protected]=> NULL ["_controllerDir":protected]=> NULL ["_dispatcher":protected]=> NULL ["_invokeParams":protected]=> array(0) { } ["_moduleControllerDirectoryName":protected]=> string(11) "controllers" ["_plugins":protected]=> object(Zend_Controller_Plugin_Broker)#5 (3) { ["_plugins":protected]=> array(0) { } ["_request":protected]=> NULL ["_response":protected]=> NULL } ["_request":protected]=> NULL ["_response":protected]=> NULL ["_returnResponse":protected]=> bool(false) ["_router":protected]=> *RECURSION* ["_throwExceptions":protected]=> bool(false) } ["_invokeParams":protected]=> array(0) { } }

Je pense que le problème se situe autre part que dans ce code, mais où ???
 
WRInaute impliqué
Personnellement, j'utilise les fichier INI pour configurer les routes. Voici un exemple :
Code:
resources.router.routes.default.type = Zend_Controller_Router_Route_Module
resources.router.routes.default.abstract = Off
resources.router.routes.default.defaults.module = "default"
resources.router.routes.default.defaults.controller = "index"
resources.router.routes.default.defaults.action = "index"

resources.router.routes.news.type = Zend_Controller_Router_Route
resources.router.routes.news.route = "actualite/:category/:title/*"
resources.router.routes.news.reqs.title = ".+"
resources.router.routes.news.defaults.module = "news"
resources.router.routes.news.defaults.controller = "new"
resources.router.routes.news.defaults.action = "view"
 
WRInaute discret
Salut,

oui j'ai essayé mais rien.

J'ai également essayé de faire sans le .ini :

Code:
$router = Zend_Controller_Front::getInstance()->getRouter();

$r = new Zend_Controller_Router_Route_Regex(
        "/i/([-\w]+)/(\d+)/",
        array('controller' => 'interet', 'action' => 'index'), 
        array(1 => 'seo', 2 => 'id'),
        'i/%s/%d/'
);

$router->addRoute('interet', $r);

mais là encore il essaye de trouver le controleur "i" au lieu de faire la route
 
WRInaute impliqué
Tu spécifie quoi comme URL pour tester ? Elle répond bien à ta RegExp ?

Essaie de préciser le module aussi : array('controller' => 'interet', 'action' => 'index', 'module' => 'default')

C'est quoi ton objectif ? Utiliser Zend_Controller_Router_Route_Regex n'est peut-être pas nécessaire.
 
WRInaute impliqué
Je viens de voir dans ta RegExp : "/i/([-\w]+)/(\d+)/"
Tu délimites avec les slashes et tu en as à l'intérieur (représente l'URL). Essaie : "#i/([-\w]+)/(\d+)#"
 
WRInaute discret
Ca me retourne

Warning: preg_match(): Unknown modifier '\' in /www/library/Zend/Controller/Router/Route/Regex.php on line 83 Warning: Invalid argument supplied for foreach() in /www/library/Zend/Controller/Router/Route/Regex.php on line 94 Warning: Invalid argument supplied for foreach() in /www/library/Zend/Controller/Router/Route/Regex.php on line 131

J'ai essayé avec "test/" et le problème et le même, il va me chercher le contrôleur test.
 
WRInaute discret
Bonne nouvelle !!!!

avec l'expression "i/([-\w]+)/(\d+).htm" et si j'appel i/rouen/18.htm ça fonctionne !
 
WRInaute discret
Oui, la bonne expression régulière était "i/([-\w]+)/(\d+)", sur 5 forums tu es le seul à avoir éclairé ma lanterne, merci à toi :)
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut