Aller au menu - Aller au contenu

Icône Personnaliser les pages d'erreur

Avatar
Mise à jour : 02/05/2012
Difficulté : Facile Facile Durée d'étude : 1 heure Creative Commons BY-NC-SA
20 752 visites depuis 7 jours, dont 156 sur ce chapitre classé 17/786
Avec Symfony2, lorsqu'une exception est déclenchée, le noyau l'attrape. Cela lui permet ensuite d'effectuer l'action adéquate.

Le comportement par défaut du noyau consiste à appeler un contrôleur particulier intégré à Symfony2 : TwigBundle:Exception:show. Ce contrôleur récupère les informations de l'exception, choisit le template adéquat (un template différent par type d'erreur), passe les informations au template et envoie la réponse générée par ce template.

À partir de là, il est facile de personnaliser ce comportement : TwigBundle étant un… bundle, on peut le modifier pour l'adapter à nos besoins ! Mais ce n'est pas le comportement que nous voulons changer, c'est juste l'apparence de nos pages d'erreur. Il suffit donc de créer nos propres templates et de dire à Symfony2 d'utiliser nos templates et non ceux par défaut.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Théorie : remplacer les templates d'un bundle

Il est très simple de remplacer les templates d'un bundle quelconque par les nôtres. Il suffit de créer le répertoire app/Resources/NomDuBundle/views/ et d'y placer nos templates !
Nos templates doivent porter exactement les mêmes noms que ceux qu'ils doivent remplacer. Ainsi, si notre bundle utilise un template situé dans « …(namespace)/RépertoireDuBundle/Resources/views/Hello/salut.html.twig », alors nous devons créer le template « app/Resources/NomDuBundle/views/Hello/salut.html.twig ».

Attention, le NomDuBundle en bleu correspond bien au nom du bundle, à savoir au nom du fichier que vous pouvez trouver à sa racine. Par exemple : SdzBlogBundle est le nom du bundle, mais il se trouve dans (src)/Sdz/BlogBundle.


Symfony2, pour chaque template qu'il charge, regarde d'abord dans le répertoire app/Resources/ s'il trouve le template correspondant. S'il ne le trouve pas, il va ensuite voir dans le répertoire du bundle.

Pratique : remplacer les templates Exception de TwigBundle

Maintenant qu'on sait le faire, il ne reste plus qu'à le faire. :p
Créez donc le répertoire app/Resources/TwigBundle/views/.
En l'occurrence, les templates des messages d'erreur se trouvent dans le répertoire Exception, créons donc le répertoire app/Resources/TwigBundle/views/Exception.
Et au sein de ce répertoire, le bundle utilise la convention suivante pour chaque nom de template :
  • il vérifie d'abord l'existence du template error[code_erreur].html.twig, par exemple, error404.html.twig dans le cas d'une page introuvable (erreur 404) ;
  • si ce template n'existe pas, il vérifie l'existence du template error.html.twig, une sorte de page d'erreur générique.


Vous pouvez créer error404.html.twig pour les pages non trouvées et error500.html.twig pour les erreurs internes, ce sont deux des plus utilisées. Mais n'oubliez pas de créer error.html.twig également, sinon, vous aurez des pages d'erreur dépareillées en cas d'erreur (401, par exemple, pour un accès refusé).

Le contenu d'une page d'erreur


Pour savoir quoi mettre dans ces templates, je vous propose de jeter un œil à celui qui existe déjà, error.html (il se trouve dans vendor\symfony\src\Symfony\Bundle\TwigBundle\Resources\views\Exception) :
Code : HTML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<!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>

        <div>
            Something is broken. Please e-mail us at [email] and let us know
            what you were doing when this error occurred. We will fix it as soon
            as possible. Sorry for any inconvenience caused.
        </div>
    </body>
</html>

Vous pouvez y voir les différentes variables que vous pouvez utiliser : {{ status_text }} et {{ status_code }}.
Fort de ça, vous pouvez créer la page d'erreur que vous souhaitez : vous avez toutes les clés.

Soyons d'accord : cette page d'erreur que l'on vient de personnaliser, c'est la page d'erreur générée en mode « prod » !


Remplacer la page d'erreur du mode « dev » n'a pas beaucoup d'intérêt : vous seul la voyez, et elle est déjà très complète. Cependant, si vous souhaitez quand même la modifier, alors cela n'est pas le template error.html.twig qu'il faut créer mais le template exception.html.twig. Celui-ci se trouve aussi dans le répertoire Exception/.
Retenez deux astuces en une :
  • modifier les templates d'un bundle quelconque est très pratique, votre site garde ainsi une cohérence dans son design, et ce, que ce soit sur votre bundle à vous comme sur les autres ;
  • personnaliser les pages d'erreur, ça n'est pas la priorité lorsque l'on démarre un projet Symfony2, mais c'est impératif avant de l'ouvrir à nos visiteurs.
Chapitre précédent Sommaire Chapitre suivant

Partager

2 commentaires pour "Personnaliser les pages d'erreur"
Note moyenne : 3.75 / 4 (245 votes)
Pseudo Commentaire
Hors ligne SpriteWare # Posté le 01/09/2011 à 02:18:50
J'ai un string dans l'Array
Avatar

Avis : Très bon

Ville : Nantes
Pays : France métropolitaine

C'est intéressant, mais imaginons que je souhaite obtenir les deux variables status_text et status_code en français, y'a t-il des fichiers déjà prêts à utiliser avec trans(), ou alors faut-il que je crée mes fichiers de traduction ?
 
Hors ligne exito # Posté le 02/01/2012 à 17:39:55

Merci beaucoup pour ce tutoriel, il ma aider bien et j'ai gagné plusieurs notions de base.
:D

Voir tous les commentaires