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 ;)
Olivier Prieur
Geek quinqua nivernais fan d'ovalie, de musique, de linuxeries et de Net.
Portfolio : https://www.olivierprieur.fr
raditz
il y a 2 ansSimple, efficace, un grand merci !
citizenz7
il y a 2 ansMerci, un plaisir :)