Cómo personalizar páginas de error

Cuando se lanza alguna excepción en Symfony2, la excepción es capturada dentro de la clase del núcleo y, finalmente, remitida a un controlador especial, TwigBundle:Exception:show para procesarla. Este controlador, el cual vive dentro del núcleo de TwigBundle, determina cual plantilla de error mostrar y el código de estado que se debe establecer para la excepción dada.

Puedes personalizar las páginas de error de dos formas diferentes, dependiendo de la cantidad de control que necesites:

  1. Personalizando las plantillas de error de las diferentes páginas de error (se explica más adelante);
  2. Reemplazando el controlador de excepciones TwigBundle::Exception:show predeterminado con tu propio controlador y procesándolo como quieras (consulta exception_controller en la referencia de Twig);

Truco

Personalizar el tratamiento de las excepciones en realidad es mucho más poderoso que lo escrito aquí. Produce un evento interno, core.exception, el cual te permite completo control sobre el manejo de la excepción. Para más información, consulta el Evento kernel.exception.

Todas las plantillas de error viven dentro de TwigBundle. Para sustituir las plantillas, simplemente confiamos en el método estándar para reemplazar las plantillas que viven dentro de un paquete. Para más información, consulta Sustituyendo plantillas del paquete.

Por ejemplo, para sustituir la plantilla de error predeterminada mostrada al usuario final, crea una nueva plantilla ubicada en app/Resources/TwigBundle/views/Exception/error.html.twig:

<!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>An Error Occurred: {{ status_text }}</title>
    </head>
    <body>
    <h1>Oops! An Error Occurred</h1>
    <h2>The server returned a "{{ status_code }} {{ status_text }}".</h2>
</body>
</html>

Prudencia

No debes utilizar is_granted en tus páginas de error (o diseños utilizados por tus páginas de error), porque el enrutador se ejecuta antes del cortafuegos. Si el enrutador lanza una excepción (por ejemplo, cuándo la ruta no coincide), entonces utilizar is_granted desencadenará una nueva excepción. You can use is_granted safely by saying {% if app.user and is_granted('...') %}.

Truco

Si no estás familiarizado con Twig, no te preocupes. Twig es un sencillo, potente y opcional motor de plantillas que se integra con Symfony2. Para más información sobre Twig consulta Creando y usando plantillas.

Además de la página de error HTML estándar, Symfony proporciona una página de error predeterminada para muchos de los más comunes formatos de respuesta, como JSON (error.json.twig), XML (error.xml.twig) e incluso Javascript (error.js.twig), sólo por nombrar algunos. Para sustituir cualquiera de estas plantillas, basta con crear un nuevo archivo con el mismo nombre en el directorio app/Resources/TwigBundle/views/Exception. Esta es la manera estándar de sustituir cualquier plantilla que viva dentro de un paquete.

Personalizando la página 404 y otras páginas de error

También puedes personalizar plantillas de error específicas de acuerdo con el código de estado HTTP. Por ejemplo, crea una plantilla app/Resources/TwigBundle/views/Exception/error404.html.twig para mostrar una página especial para los errores 404 (página no encontrada).

Symfony utiliza el siguiente algoritmo para determinar qué plantilla utilizar:

  • En primer lugar, busca una plantilla para el formato dado y el código de estado (como error404.json.twig);
  • Si no existe, busca una plantilla para el formato propuesto (como error.json.twig);
  • Si no existe, este cae de nuevo a la plantilla HTML (como error.html.twig).

Truco

Para ver la lista completa de plantillas de error predeterminadas, revisa el directorio Resources/views/Exception de TwigBundle. En una instalación estándar de Symfony2, el TwigBundle se puede encontrar en vendor/symfony/symfony/src/Symfony/Bundle/TwigBundle. A menudo, la forma más fácil de personalizar una página de error es copiarla de TwigBundle a app/Resources/TwigBundle/views/Exception y luego modificarla.

Nota

El amigable depurador de páginas de excepción muestra al desarrollador cómo, incluso, puede personalizar de la misma manera creando plantillas como exception.html.twig para la página de excepción HTML estándar o exception.json.twig para la página de excepción JSON.

Bifúrcame en GitHub