Кастомизация страниц ошибок в Symfony

В одном из предыдущих постов я описывал как кастомизировать страницы ошибок в Laravel-приложении.Теперь же рассмотрим как это можно реализовать в проекте на базе  Symfony/

Symfony все ошибки и исключения обрабатывает через единый механизм — независимо от того, происходит ли это из-за отсутствующей страницы, ограничения доступа или критической проблемы в коде приложения. Такой подход обеспечивает согласованность обработки и централизованное управление отображением ошибок, что особенно важно для поддержания пользовательского опыта и безопасности приложения.

В режиме разработки (env=dev) Symfony автоматически перехватывает все исключения и отображает детальную страницу с исчерпывающей отладочной информацией. Эта страница включает трассировку стека, значения переменных, историю запросов и другую полезную информацию для разработчика, что значительно ускоряет процесс отладки.

Symfony error page dev

Однако в продакшн-режиме (env=prod) показ такой информации представляет угрозу безопасности, поскольку может раскрыть внутреннюю структуру приложения, конфигурационные данные или фрагменты кода. Поэтому Symfony по умолчанию отображает упрощенную, нейтральную страницу ошибки без каких-либо технических деталей.

Symfony error page prod

Для кастомизации шаблонов ошибок через Twig необходимо убедиться, что в проекте установлены и активированы необходимые компоненты. Symfony использует `TwigErrorRenderer` для рендеринга страниц ошибок, который следует определенному алгоритму при выборе шаблона:

- Сначала ищется шаблон, соответствующий конкретному HTTP-коду состояния (например, `error404.html.twig` для ошибки 404)
- Если шаблон для конкретного кода не найден, используется общий шаблон `error.html.twig`

Чтобы переопределить эти шаблону, нужно просто создать вот такую стрктуру каталогов и файлов шаблонов:

templates/
└─ bundles/
└─ TwigBundle/
└─ Exception/
├─ error404.html.twig    # Для ошибок "Не найдено"
├─ error403.html.twig    # Для ошибок доступа
├─ error500.html.twig    # Для внутренних ошибок сервера
├─ error503.html.twig    # Для режима обслуживания
└─ error.html.twig       # Универсальный шаблон для остальных ошибок

Вот так может выглядеть шаблон для страницы ошибки 404:

{# templates/bundles/TwigBundle/Exception/error404.html.twig #}
{% extends 'base.html.twig' %}

{% block title %}Страница не найдена | {{ app_name }}{% endblock %}

{% block body %}
    <div class="container mt-5">
        <div class="row justify-content-center">
            <div class="col-md-8 text-center">
                <div class="error-container">
                    <h1 class="display-1 text-muted">404</h1>
                    <h2 class="mb-4">Страница не найдена</h2>
                    <p class="lead text-muted mb-4">
                        Запрашиваемая страница не существует или была перемещена.
                    </p>
                    <div class="mb-4">
                        <i class="fas fa-search fa-3x text-muted mb-3"></i>
                    </div>
                    <div class="d-flex justify-content-center gap-3 flex-wrap">
                        <a href="{{ path('main') }}" class="btn btn-primary">
                            <i class="fas fa-home me-2"></i>На главную
                        </a>
                        <button onclick="history.back()" class="btn btn-outline-secondary">
                            <i class="fas fa-arrow-left me-2"></i>Назад
                        </button>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <style>
        .error-container {
            padding: 3rem 0;
        }
        .display-1 {
            font-size: 8rem;
            font-weight: 300;
            line-height: 1;
        }
        @media (max-width: 768px) {
            .display-1 {
                font-size: 5rem;
            }
        }
    </style>
{% endblock %}

И при открытии несуществующего адреса сайта, пользователь увидит например вот такую страницу:

Symfony error page 404 custom

Вот так можно просто и быстро настроить кастомный дизайн для страниц ошибок (403, 404 и т.п.) в проекте на базе фреймворка   Symfony.