Когда любое исключение кидается в Symfony2, они перехватывается в классе Kernel и в конечном счете обрабатываеются специальным контроллером TwigBundle:Exception:show. Этот контроллер, находится внутри TwigBundle, определяет каким шаблоном выводит ошибку.

Страницы ошибок можно кастомизировать 2 различными путями, в зависимости от того чего вы хотите:

  1. Кастомизировать шаблоны ошибок в зависимости от ошибки
  2. Заменить стандартный контроллер twig.controller.exception:showAciton

ExceptionController по умолчанию

ExceptionController будет выводит исключения или ошибки на страницу, в зависимости от флага kernel.debug. Страница исключений будет выводит вам много полезной информации в окружении разработки, страницы ошибок должны быть показаны для конечного пользователя.

[su_spoiler open=”yes” icon=”” class=”my-spoiler tip” title=”Testing Error Pages during Development”]

Вам не обязательно устанавливать kernel.debug в значения false для того чтобы увидеть страницу ошибок во время разработки. Это так же выключит обработку шаблонов и в других местах.

Сторонний бандл WebfactoryExceptionsBundle предоставляет спечиальный тестовый контроллер, который позволяет вывести ваши страницы ошибок для произвольного HTTP статуса, даже когда kernel.debug установлен в true.

[/su_spoiler]

Переопределить шаблоны ошибок

Все шаблоны ошибок находятся в TwigBundle. Чтобы переопределить шаблоны, просто положитесь на стандартные методы для переопределения шаблонов внутри бандлов. Смотри Overriding Bundle Templates

Например, чтобы переопределить стандартный шаблон ошибок, создайте новый шаблон и поместите его в app/Resources/TwigBundle/views/Exception/error.html.twig:

[su_spoiler open=”yes” icon=”” class=”my-spoiler caution” title=””]

Вам нельзя использовать is_granted в ваших страницах ошибок ( или слоях, которые используют страницы ошибок ), т.к. маршрутаризация происходит раньше firewall. Если маршрут выкинет исключение ( например, если маршрута не существует ), тогда использование is_granted выкинет ошибку. Вместо этого используйте следующую конструкцию:

[/su_spoiler]

[su_spoiler open=”yes” icon=”” class=”my-spoiler tip” title=””]

Если вы не знакомы с Twig, don’t worry be happy. Twig – это простой, можный и дополнительный генератор шаблонов, который интегрирован в Symfony2. Для большей информации посмотрите Creating and Using Templates.

[/su_spoiler]

Кроме стандартной HTML страницы ошибок, Symfony предоставляет другие форматы, такие как JSON (error.json.twig), XML (error.xml.twig) и даже JavaScript (error.js.twig). Чтобы переопределить любой из этих шаблонов, достаточно создать новый с таким же именем в папке app/Resources/TwigBundle/views/Exception. Это стандратный путь для переопределения шаблонов, которые находятся в бандле.

Кастомизация 404 страницы и других ошибок

Вы также можете кастомизировать определенный шаблон в соответствии со HTTP статусом. Например, создайте в папке app/Resources/TwigBundle/views/Exception/error404.html.twig шаблон, который будет выводит специальную страницу для 404 ошибки.

Symfony использует следующий алгоритм для определения какой шаблон использовать:

  • В начале, она смотри есть ли шаблон с таким же статусом ( error404.json.twig);
  • Если нет, то смотри шаблон с таким же форматом ( error.json.twig );
  • Если нет, то возвращает HTML шаблон ( error.html.twig );

[su_spoiler open=”yes” icon=”” class=”my-spoiler tip” title=””]

Чтобы увидеть полный список стандартный шаблонов ошибок, смотри папку Resources/views/Exception в TwigBundle. В стандартной сборке Symfony2, TwigBundle может быть найден в папке  vendor/symfony/symfony/src/Symfony/Bundle/TwigBundle. Части, самым простым способом кастомизации страницы ошибок это скопировать его из TwigBundle в папку app/Resources/TwigBundle/views/Exception и уже здесь изменять.

[/su_spoiler]

[su_spoiler open=”yes” icon=”” class=”my-spoiler note” title=””]

Страница ошибок для дебага также может быть кастомизирована путем создания шаблона вроде exception.html.twig для замены стандартной HTML страницы или exception.json.twig для замены JSON исключения.

[/su_spoiler]

Заменить стандартный Exception Controller

Если вам нужно больше гибкости, чем простое переопределение шаблонов ( например вам нужно передать несколько дополнительных переменных в шаблон ), тогда вы можете переопределить контроллер, который рендерид страницу ошибки.

Стандартный контроллер ошибок зарегистрирован как сервис – точный класс Symfony\Bundle\TwigBundle\Controller\ExceptionController

Чтобы сделать это создайте новый класс, и расширьте стандартный Symfony\Bundle\TwigBundle\Controller\ExceptionController

Если несколько способов как можно переопределить различные части страницы ошибок.

Вы можете, например, переопределить метод showAction или только findTemplate, который определяет какой использовать шаблон

Чтобы использовать ваш контроллер исключений вместо стандартного, установите настройку в twig.exception_controller в app/config/config.yml

[su_spoiler open=”yes” icon=”” class=”my-spoiler tip” title=””]

Настройка обработчика исключений еще более мощная вещь, чем переопределение. Внутренее собитие, kernel.exception, кидает исключение которые позволяет получить полный контроль над ошибкой. Читай kernel.exception Event.

[/su_spoiler]