Question

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

L’idée est d’injecter des routes à l’initialisation et, lorsque la demande ne peut pas être acheminée vers l’une des routes injectées, elle doit être transmise au contrôleur d’erreur. (en utilisant le registre par défaut Zend_Controller_Plugin_ErrorHandler)

Tout cela fonctionne bien, jusqu'à ce que je désactive les routes par défaut avec $ router- > removeDefaultRoutes (); Lorsque je le fais, le contrôleur d'erreur ne route plus les demandes non acheminées vers le contrôleur d'erreur. Au lieu de cela, il achemine toutes les demandes non traitées à indexAction sur le contrôleur par défaut.

Quelqu'un sait-il comment désactiver le routage d'action par défaut /: controller /: mais GARDER le traitement des erreurs de routage?

En gros, voici 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);
Était-ce utile?

La solution

Le problème lorsque vous supprimez les routes par défaut est que Zend ne comprend plus les urls /: module /: controller /: action. Ainsi, chaque route envoyée est routée vers le module par défaut, Contrôleur d'index, Action d'index.

Le plug-in Error fonctionne sur la méthode postDispath de la répartition du contrôleur et fonctionne car dans le routeur standard, si le contrôleur, le module ou l'action n'est pas trouvé, une erreur est renvoyée.

Pour activer les itinéraires personnalisés dans cette configuration, vous devez écrire un nouveau plug-in qui fonctionne sur le pré-envoi, puis vérifier si l'itinéraire est redirigé vers le plug-in error s'il est une URL non valide.

Autres conseils

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

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

aucune de vos routes ne correspond à cette configuration. Donc ça va échouer. Je suppose que vous pouvez ajouter uniquement cette route à partir de la valeur par défaut, comme suit:

$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);

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 d'abord ajouter cet itinéraire car il doit être le dernier traité.

Et dans ErrorController j'ai défini:

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

Ainsi, toute route qui ne correspond pas à nos routes utilisera le gestionnaire d'erreurs par défaut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top