Symfony 6 : pages d'erreur custom sans bundle

Symfony 6 : pages d'erreur custom sans bundle

J'ai dernièrement voulu mettre en place des pages d'erreur personnalisées sous Symfony 6.1. En suivant la documentation de Symfony (https://symfony.com/doc/current/controller/error_pages.html), je n'ai jamais réussi à faire fronctionner les pages d'erreur. J'avais constamment une page blanche pour une erreur 404 par exemple...
j'ai alors regardé s'il était possible de se passer du traditionnel templates/bundles/TwigBundle/Exception...

Et j'y suis parvenu. L'idée est de créer un controller, un template et de dire à Symfony de manière hyper simple, quel controller s'occupe des erreurs.
Allons-y.

Créons premièrement un controler src/Controller/ErrorController.php
Il s'agit ici d'un controller hyper basique qui oriente sur un template

<?php

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class ErrorController extends AbstractController
{
    #[Route('/error', name: 'app_error')]
    public function show(): Response 
    {
        return $this->render('error/index.html.twig', [
            'controller_name' => 'ErrorController',
        ]);
    }
}

Le template en question : templates/error/index.html.twig
Ici, j'ai adapté le template à mon site (HTML, CSS) et je teste si on est sur une erreur 403, 404, 500 ou n'importe quoi d'autre.
A vous d'adapter le texte, etc.

{% extends 'base.html.twig' %}

{% block title %}Erreur{% endblock %}

{% block body %}
<main id="main">

     <section class="single-post-content">
        <div class="container">
            <div class="row">
                <div class="col mt-4 alert-danger py-5 px-3 text-center">
                    {% if app.request.attributes.get('exception').statusCode == '404' %}
                        <h1 class="display-2 fw-bold">ERREUR 404</h1>
                        <h5>La page que vous recherchez n'existe pas... ou plus !</h5>
                    {% elseif app.request.attributes.get('exception').statusCode == '403' %}
                        <h1 class="display-2 fw-bold">ERREUR 403</h1>
                        <h5>Vous ne pouvez pas afficher cette page ou cette section !</h5>
                    {% elseif app.request.attributes.get('exception').statusCode == '500' %}
                        <h1 class="display-2 fw-bold">ERREUR 500</h1>
                        <h5>Oups !?! Alors là, on a un problème... La page ou la section ne s'affiche pas. Si vous avez 2
                        minutes, merci de prévenir l'administrateur du site.</h5>
                    {% else %}
                        <h5>Oups !?! Désolé, il y a une erreur. Si vous avez 2
                        minutes, merci de prévenir l'administrateur du site ou d'envoyer un message depuis la page <a href="{{ path('app_contact') }}">contact</a>.</h5>
                    {% endif %}
                </div>

                <div class="mt-3 text-center">
                    <a class="btn btn-primary p-3 lead" href="{{ path('app_home') }}">Page d'accueil</a>
                </div>
            </div>
        </div>
    </section>
    
</main>
{% endblock %}

Enfin, il suffit de dire à Symfony quel est le controller qui se charge des erreurs. Et ça se passe dans config/packages/framework.yaml

framework:
    error_controller: App\Controller\ErrorController::show

Et zou ! A vous de jouer ;)

citizenz7
Posté par citizenz7

Geek quinqua nivernais fan d'ovalie, de linuxerie, de musique et de Net

0 commentaire

Laisser un commentaire

Votre adresse email ne sera pas publiée.

Email:
Pseudo:
Message:
Accepter les CGU
Recopiez le code antispam: