Error cuando Zend_Layout se muestra dos veces

Diseño del patrón MVCUn error que ha surgido trabajando con Zend Framework, es que hay unas excepciones que cuando son tratadas por el controlador de errores, se muestra dos veces el contenido del layout. Esto es debido a que Zend Framework trae por defecto dos plugins (si se utiliza el Zend_Layout), que estan al final de la pila de ejecución de plugins:

  • Zend_Layout_Controller_Plugin_Layout: este plugin actua en el postDispatch, y aplica el patrón Two Step View (captura el contenido en el Zend_Response, y después lo pasa al Zend_Layout para processarlo y se inyectado en el script de la vista del Layout).
  • Zend_Controller_Plugin_ErrorHandler: también actua en el postDispatch, y se encarga de comprobar si se ha producido una excepción y ha sido registrada. En tal caso, ejecuta otra petición al controlador y acción para tratar errores y mostrarlos según sea conveniente.

El plugin de layout es ejecutado en la posición 99 de la pila, y el plugin de errores en la 100. Esto provoca que se ejecute una petición en el controlador de errores, habiendo establecido ya el layout. Para resolver este problema existen dos formas: cambiar el orden de ejecución de los plugins, o vaciando el contenido de la respuesta cuando se ejecuta la petición de tratamiento de errores.

La última opción es la más simple y conlleva menos problemas; solamente hay que añadir una línea en la acción del controlador de errores. Normalmente se trata del errorAction del ErrorController, y la primera línea de código debería ser:

public function errorAction() {
 
        $this->getResponse()->clearBody();
 
        //handle error ........
}

El siguiente diagrama muestra el flujo de ejecución de Zend Framework:

Diagrama de flujo de Zend Framework

Artículos relacionados:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>