2009-09-14 17 views
4

J'utilise Zend FW 1.9.2, je veux désactiver les routes par défaut et fournir les miennes. I vraiment n'aime pas le défaut /: controller /: le routage d'action.Cadre Zend: Suppression des routes par défaut

L'idée est d'injecter des routes à init, et lorsque la requête ne peut pas être acheminée vers l'une des routes injectées, elle doit être transmise au contrôleur d'erreurs. (En utilisant le registere Zend_Controller_Plugin_ErrorHandler défaillant peut)

Tout cela fonctionne très bien, jusqu'à ce que désactiver les routes par défaut avec router- $> removeDefaultRoutes(); Lorsque je fais cela, le contrôleur d'erreur n'achemine plus les requêtes non routées vers le contrôleur d'erreurs. Au lieu de cela, il achemine toutes les demandes non routées vers indexAction sur le contrôleur par défaut.

Quelqu'un at-il une idée de comment désactiver le par défaut /: controller /: action routing mais GARDER la gestion des erreurs de route?

En fait, ce que je fais:

$frontController = Zend_Controller_Front::getInstance(); 
$router = $frontController->getRouter(); 
$router->removeDefaultRoutes(); // <-- when commented, errorhandling works as expected 

$route = new Zend_Controller_Router_Route_Static(
    '', 
    array('controller' => 'content', 'action' => 'home') 
); 
$router->addRoute('home', $route); 

Répondre

5

Le problème lorsque vous supprimez les routes par défaut est que pas Zend comprend plus le urls /: module /: controller /: action, de sorte à chaque fois qu'un itinéraire est envoyé, il est routé vers le module par défaut, index Controller, index Action. Le plugin Error fonctionne sur la méthode postDispath du dispatch du contrôleur et fonctionne parce que dans le routeur standard, si le contrôleur, le module ou l'action est introuvable, il génère une erreur.

Pour activer les routes personnalisées dans cette configuration, vous devez écrire un nouveau plugin qui fonctionne sur preDispatch, et vérifier si la route, puis rediriger vers le plugin d'erreur dans le cas où il s'agit d'une URL non valide.

+0

Merci, cela a du sens, je vais le tester. – Maurice

0

Lorsque vous supprimez les routes par défaut, vous supprimez la route par défaut que le plug-in de gestionnaire d'erreurs utilise. Cela signifie que lorsqu'il essaie de router vers

array('module' => 'default, 'controller' => 'error', 'action' => 'index') 

aucun de vos itinéraires ne correspond à cette configuration. Donc ça va échouer. Je suppose que vous pouvez simplement ajouter cette route à partir de la valeur par défaut comme ceci:

$frontController = Zend_Controller_Front::getInstance(); 
$router = $frontController->getRouter(); 
$router->removeDefaultRoutes(); // <-- when commented, errorhandling works as expected 
// Re-add the error route 
$router->addRoute(
    'error', 
    new Zend_Controller_Router_Route (
     'error/:action', 
     array (
      'controller' => 'error', 
      'action' => 'error' 
     ) 
    ) 
); 

$route = new Zend_Controller_Router_Route_Static(
    '', 
    array('controller' => 'content', 'action' => 'home') 
); 
$router->addRoute('home', $route); 
+0

J'ai vérifié, mais le plugin errorhandling par défaut n'injecte pas de routes, donc la suppression des routes par défaut ne devrait (en théorie) pas avoir d'effet sur lui. J'ai essayé d'ajouter une route d'erreur comme vous l'avez fait, mais rien ne change dans la façon dont cela fonctionne. Pour être honnête, je ne pense pas vraiment que votre réponse ait du sens, car cela ne correspondra qu'à une requête comme/error/asd et/error/qwe etc. Ai-je raté quelque chose? – Maurice

-1

j'ai rencontré le même problème pour une ancienne application, voici ce qui a résolu mon problème:

$front = Zend_Controller_Front::getInstance(); 
$router = $front->getRouter(); 
$route = new Zend_Controller_Router_Route('*', array('controller'=>'error', 'module'=>'error', 'action'=>'notfound')); 
$router->addRoute('default', $route); 
// After that add your routes. 

Vous devez ajouter cette voie d'abord comme il doit être le dernier traité.

Et dans ErrorController je définis:

public function notfoundAction() 
{ 
    throw new Zend_Controller_Action_Exception('This page does not exist', 404); 
} 

De cette façon, toute voie qui ne correspond pas à nos routes utilisera le gestionnaire d'erreurs par défaut.