Utilisation de Zend_Controller_Router_Rewrite

  • Auteur de la discussion Auteur de la discussion neo765
  • Date de début Date de début
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
 
Quand une erreur se produit, Zend redirige vers le controller Error. Vérifie qu'il soit bien quelque part.
 
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
 
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...
 
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ù ???
 
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"
 
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
 
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.
 
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+)#"
 
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.
 
Bonne nouvelle !!!!

avec l'expression "i/([-\w]+)/(\d+).htm" et si j'appel i/rouen/18.htm ça fonctionne !
 
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