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

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

Для кастомизации шаблонов ошибок через 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 %}
И при открытии несуществующего адреса сайта, пользователь увидит например вот такую страницу:

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