Mar 19 2009

Symfony: настраиваем собственные обработчики ошибок (404, 500, unavailable.php)

Category: Symfonyingvar @ 03:57

На каждом проекте не забываем настраивать обработчики ошибок, а то получим вот такие сюрпризы на продакшен сервере для страниц ошибок 404 и 500:

symfony_error_page_404

symfony_error_page_500

Настройка собственного действия и шаблона ошибки 404

1) Активируем опции error_404_module и error_404_action в конфигурационном файле settings.yml

all:
  .actions:
    error_404_module:       error # Указываем наш модуль
    error_404_action:       error404  # и действие

2) Создаем наш шаблон ошибки 404 error404Success.php

<html>
 <head>
  <title>Ошибка 404</title>
 </head>
 <body>
    Упс! Страница не найдена!
 </body>
</html>

3) Очищаем кеш проекта

php symfony cc

Учтите, что в dev-режиме отработает обработчик ошибки 404 Symfony, а не наш. Такой небольшой нюанс.

Выводим собственную страницу для ошибок 500

За это отвечает файл error.html.php. Оригинал файла можно найти в исходниках Symfony «/symfony-1.2/lib/exception/data/error.html.php». Файл надо создать в папке нашего проекта «config/error/error.html.php»

Настраиваем собственный шаблон страницы при отключении нашего приложения (application)

Когда это может потребоваться? Например, Вам требуется обновить Ваш сайт, и это заберет некоторое время. В этом случае отключаем наш сайт и выводим красивую страничку, мол у нас проводятся «технические работы». Весьма полезная штука.

Что надо чтобы отключить/включить наше приложение:

1) Создаем свой шаблон unavailable.php и кладем его в одну из следующих директорий:
• /site/apps/frontend/config/unavailable.php
• /site/config/unavailable.php
• /site/config/web/errors/unavailable.php

Тут есть один момент. Можно спросить: «А зачем нам сохранять файл в папке frontend?». Это весьма полезная особенность, т.к. в этом случае мы можем изменить вывод этой страницы для www и wap, что очень важно.

2) Включаем опцию check_lock в файле settings.yml. После того как закончили все работы и включили приложение, не забудьте отключить эту опцию, т.к. при каждой загрузке страницы осуществляется проверка состояния приложения.

  .settings:
    check_lock:             on

3) Отключаем наше приложение

php symfony project:disable frontend prod

4) Очищаем кеш проекта и наше приложение отключено

php symfony cc

Для включения приложения выполняем следующие команды:

php symfony project:enable frontend prod
php symfony cc

Что классно, то что frontend_dev.php — не отключается, т.е. можно проверить работу сайта в отладочном режиме, или отключить и этот режим. Не забываем удалять этот файл на продакшен сервере :).

Материал по теме:
The Definitive Guide to symfony: Chapter 6 — Inside The Controller Layer
The Definitive Guide to symfony: Chapter 19 — Mastering Symfony’s Configuration Files
The symfony Cookbook: How to customize Error Templates
Completely custom Symfony error pages

Tags:

5 Responses to “Symfony: настраиваем собственные обработчики ошибок (404, 500, unavailable.php)”

  1. Alex says:

    Еще для реализации страниц ошибок можно не ковырять настройки, а просто создать модуль default и переопределить нужные нам шаблоны. Для 500 ошибки такое не сработает, конечно…

  2. ingvar says:

    А настройки как раз и переопределяют модуль error_404_module. Все делается штатным механизмом Симфони, и когда вызываем метод «$this->forward404()», то редиректим на свою страницу 404.

  3. Serg says:

    Вместо отключения сайта через командлайн проще в index.php написать первой строкой
    die(‘Сайт временно остановлен. Возвращайтесь через несколько минут.’);
    при этом так же index_dev.php будет работать.
    Так-то!

  4. ingvar says:

    Это да, но это не есть самый красивый вариант.

    Ничто не мешает сделать эту страничку, такую же как и 404, в стиле сайта, а не просто на белом экране фраза: «Сайт временно остановлен. ..».

    Плюс ещё один момент, если вдруг, что-то сломается на сайте, то пользователи увидят ту же страницу «unavailable.php «, а не стандартную ошибку Симфони.

  5. dmlance says:

    Спасибо за пост!
    Теперь нормально все настроил в своем проекте :)
    404 настроил сразу под свой модуль, а 500 долго ковырял, т.к. сперва пытался сделать по древнему faq от 1.0 симфони.

Leave a Reply to ingvar