15 oct. 2024 | Connexion

Blog

Symfony 6 : pages d'erreur custom sans bundle

Symfony 6 : pages d'erreur custom sans bundle

Développement web
Symfony PHP Twig HTML

il y a 2 ans citizenz7 2 commentaires 4497 lectures

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 ;)

2 commentaires


raditz, le 22-02-2023 à 12:01:47

Simple, efficace, un grand merci !

citizenz, le 03-03-2023 à 19:47:42

Merci, un plaisir :)

Nb d'articles actifs : 50 | Nb de commentaires : 39 | Nb de catégories : 8 | Nb de tags : 32 | Nb total de lectures : 218 381
2024 citizenz.info • Some rights reserved GPLv3 • Version 3.3.5

En plus je connais une technique pour tuer trois hommes en un coup rien qu’avec des feuilles mortes ! Alors là, vous êtes deux, vous avez bien de la chance. (Kaamelott, Livre IV, Les Chaperons)