Pregunta

Estoy usando Zend FW 1.9.2, quiero deshabilitar las rutas predeterminadas y proporcionar las mías. realmente no me gusta el enrutamiento por defecto /: controlador /: acción.

La idea es inyectar rutas en init, y cuando la solicitud no se puede enrutar a una de las rutas inyectadas, se debe enviar al controlador de errores. (mediante el registro predeterminado Zend_Controller_Plugin_ErrorHandler)

Todo esto funciona bien, hasta inhabilito las rutas predeterminadas con $ router- > removeDefaultRoutes (); Cuando hago eso, el controlador de error ya no dirige las solicitudes no enrutadas al controlador de error. En su lugar, enruta todas las solicitudes no enrutadas a indexAction en el controlador predeterminado.

¿Alguien tiene alguna idea de cómo deshabilitar el enrutamiento predeterminado: / controller /: action pero MANTENER el manejo de errores de ruta?

Básicamente, esto es lo que hago:

$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);
¿Fue útil?

Solución

El problema cuando elimina las rutas predeterminadas es que Zend ya no comprende las URL /: module /: controller /: action, por lo que cada vez que se envía una ruta, se enruta al Módulo predeterminado, Index Controller, index Action.

El complemento Error funciona en el método postDispath del envío del controlador y funciona porque en el enrutador estándar si no se encuentra el controlador, el módulo o la acción, arroja un error.

Para habilitar rutas personalizadas en esta configuración, debe escribir un nuevo complemento que funcione en el preDispatch, y verificar si la ruta y luego redirigir al complemento de error en caso de que sea una URL no válida.

Otros consejos

Cuando elimina las rutas predeterminadas, elimina la ruta predeterminada que utiliza el complemento del controlador de errores. Esto significa que cuando intenta enrutar a

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

ninguna de sus rutas coincide con esta configuración. Por lo tanto fallará. Supongo que podría agregar solo esta ruta desde el valor predeterminado de la siguiente manera:

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

Encontré el mismo problema para una aplicación anterior, esto es lo que resolvió mi problema:

$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.

Primero debe agregar esta ruta, ya que debe ser la última procesada.

Y en ErrorController definí:

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

De esta forma, cualquier ruta que no coincida con nuestras rutas utilizará el controlador de errores predeterminado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top