2012-06-28 20 views
5

Tengo miembros que se pueden bloquear y cuando el miembro está bloqueado, quiero enviarlos a una página de error personalizada, ¿cómo haré eso en Zend Framework? ProbéCómo enviar a páginas de error personalizadas Zend Framework?

throw new Zend_Controller_Dispatcher_Exception('Your message here'); 

pero no dice "aquí su mensaje", dice "página no encontrada" cuando hago esto.

aquí está mi controlador de errores.

<?php 

class ErrorController extends Zend_Controller_Action 
{ 

public function errorAction() 
{ 
    $errors = $this->_getParam('error_handler'); 

    switch ($errors->type) { 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE: 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: 

      // 404 error -- controller or action not found 
      $this->getResponse()->setHttpResponseCode(404); 
      $this->view->message = 'Page not found'; 
      break; 

      // 666 error -- controller or action not found 
      $this->getResponse()->setHttpResponseCode(666); 
      $this->view->message = 'Blocked'; 
      break; 
     default: 
      // application error 
      $this->getResponse()->setHttpResponseCode(500); 
      $this->view->message = 'Application error'; 
      break; 
    } 

    // Log exception, if logger available 
    if ($log = $this->getLog()) { 
     $log->crit($this->view->message, $errors->exception); 
    } 

    // conditionally display exceptions 
    if ($this->getInvokeArg('displayExceptions') == true) { 
     $this->view->exception = $errors->exception; 
    } 

    $this->view->request = $errors->request; 
} 

public function getLog() 
{ 
    $bootstrap = $this->getInvokeArg('bootstrap'); 
    if (!$bootstrap->hasPluginResource('Log')) { 
     return false; 
    } 
    $log = $bootstrap->getResource('Log'); 
    return $log; 
} 

} 

Aquí está la documentación, http://framework.zend.com/manual/en/zend.exception.using.html yo no lo entiendo :(

Respuesta

8

Aquí hay algunas sugerencias para hacerlo funcionar.

Primero debe diferenciar su error de los errores estándar no_route/no_controller/no_action. . Para ello, puede lanzar su propia excepción personalizada (se puede extender este de la clase de PHP Exception

throw new My_Exception_Blocked('You are blocked'); 

A continuación, modifique el controlador de errores para tener este aspecto:

public function errorAction() 
{ 
    $errors = $this->_getParam('error_handler'); 

    switch ($errors->type) { 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE: 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER: 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION: 

      // 404 error -- controller or action not found 
      $this->getResponse()->setHttpResponseCode(404); 
      $this->view->message = 'Page not found'; 
      break; 

     // check for any other exception 
     case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_OTHER: 
      if ($errors->exception instanceof My_Exception_Blocked) { 
       $this->getResponse()->setHttpResponseCode(403); 
       $this->view->message = $errors->exception->getMessage(); 
       break; 
      } 
      // fall through if not of type My_Exception_Blocked 

     default: 
      // application error 
      $this->getResponse()->setHttpResponseCode(500); 
      $this->view->message = 'Application error'; 
      break; 
    } 
} 

que también cambió el código de respuesta de 666 a 403 ya que no hay 6xx códigos de error HTTP y esto podría molestar al servidor y/o cliente.

Espero que ayude.

+0

¡Gracias por la respuesta! ¿Qué piensas de la respuesta de Cemal con respecto al manejo de problemas como que los miembros bloqueados reciban un mensaje de error con este manejador de errores? ¿Debería usarlo o programar usando otro controlador? – Darius

+0

Sería tan fácil llamar a un asistente de acción o método estático como lanzar una excepción y hacer que el controlador de error lo maneje. Si bien el plugin ErrorHandler predeterminado está diseñado para detectar excepciones específicas como errores 404, tiene sentido no complicarlo demasiado. He hecho modificaciones menores a mis controladores de errores para manejar otras condiciones, así que supongo que si se adapta a sus necesidades, siga las instrucciones del manual y simplemente implemente un asistente que lo haga. – drew010

5

No debe usar plug-in del controlador de error para gestionar errores programáticos. Yo sugeriría simplemente redirigir el usuario a un controlador donde se va a ver el mensaje requerido. implementación del controlador de error en Zend Framework se complica innecesariamente. puede resolver el problema fácilmente mediante la reorientación.

Utilizando el controlador de errores para errores programáticos también se recomienda. Detalles de la documentación es abajo.

Zend_Controller_Plugin_ErrorHandler proporciona un complemento adicional para que maneja las excepciones lanzadas por su aplicación, incluidas las que resultan de la falta de controladores o acciones; es una alternativa a los métodos enumerados en la sección Excepciones de MVC.

Los objetivos principales del plugin son:

  • excepciones Intercept plantearon cuando ninguna ruta coincide

  • excepciones Intercept planteadas debido a los controladores que faltan o acción métodos excepciones

  • Intercept planteadas dentro de los controladores de acción

En otras palabras, el complemento ErrorHandler está diseñado para manejar HTTP errores de tipo 404 (falta página) y 500 errores de tipo (error interno). No está destinado a detectar excepciones planteadas en otros complementos.

+0

¡Gracias por la sugerencia! Consideraré esto en mi programación y programa en consecuencia ahora. – Darius

Cuestiones relacionadas