Мобильная
версия

Страницы с ошибками (404, 500 и т.п.)

Дата: Категория: Symfony

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

Ошибки в Symfony 2 

Вот, например, экран 404 ошибки. В данном случае логи в большинстве случаев не несут никакой полезной информации (при 404 ошибке), но если ошибка 500, то с помощью них можно легко отладить код, узнать где собака зарыта.

При деплое эту страницу надо, разумеется, заменить на более красивую. Но как?

Страницы с ошибками находятся у Symfony в TwigBundle, (vendor/symfony/symfony/src/Symfony/Bundle/TwigBundle) а структура следующая - в корневой папке находится layout.html.twig в котором находится базовый template, а подключаемые, в зависимости от ошибки, находятся в папке Exception.

Окей - с этим разобрались. Приступим к действиям.
Первым делом нужно создать папку app/Resources/TwigBundle/views. Она является папкой в которой переопределяются все view. Мы будем редактировать только базовый шаблон, так как не думаю что вы захотите выводить разные вьюхи на 404 или 500 ошибки.
Создаем в этой папке layout.html.twig, и добавляем в него простое сообщение об ошибке без каких либо данных.

 <!DOCTYPE html>
 <html>
    <head>
    </head>
    <body>
        Ошибка
    </body>
 </html>
Теперь при бросании сервером исключения (Exception) мы будем получать белую страницу с надписью "Ошибка".
(по поводу ее красоты пусть беспокоятся дизайнеры и верстальщики. Нам она ни к чему)

Немного не хватает информативности. Надо добавить код, и текст ошибки
В этом нам помогут следующие переменные

  • status_code - код ошибки (404, 500) 
  • status_text - текст ошибки
<!DOCTYPE html>
 <html>
    <head>
    </head>
    <body>
        Ошибка {{ status_code }}<br>
        {{ status_text }}
    </body>
 </html>

На это статью можно было бы закончить, еслиб не одно НО.
Как нам теперь отлавливать ошибки?

Тут все тоже не слишком сложно - проверяем в этом файле окружение, и в зависимости от него выводим тот или иной результат.

{% if app.environment == 'dev' %}

Если мы находимся на dev (http://site.com/app_dev.php/), то просто выводим стандартный шаблон, а если нет, то нашу ошибку.
Вот полный код моего layout.html.twig (разумеется до работы над ним дизайнерами и верстальщиками)

{% if app.environment == 'dev' %}

    <!DOCTYPE html>
    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset={{ _charset }}"/>
        <meta name="robots" content="noindex,nofollow" />
        <title>{% block title '' %}</title>
        <link href="{{ asset('bundles/framework/css/exception_layout.css') }}" rel="stylesheet" type="text/css" media="all" />
        <link href="{{ asset('bundles/framework/css/exception.css') }}" rel="stylesheet" type="text/css" media="all" />
    </head>
    <body>
    <div id="content">
        <div class="header clear_fix">
            <div class="header_logo">
                <img src="{{ asset('bundles/framework/images/logo_symfony.png') }}" alt="Symfony" />
            </div>

            <div class="search">
                <form method="get" action="http://symfony.com/search">
                    <div class="form_row">

                        <label for="search_id">
                            <img src="{{ asset('bundles/framework/images/grey_magnifier.png') }}" alt="Search on Symfony website" />
                        </label>

                        <input name="q" id="search_id" type="search" placeholder="Search on Symfony website" />

                        <button type="submit">
                            <span class="border_l">
                              <span class="border_r">
                                <span class="btn_bg">OK</span>
                              </span>
                            </span>
                        </button>
                    </div>
                </form>
            </div>
        </div>

        {% block body '' %}
    </div>
    </body>
    </html>

{% else %}

    <!DOCTYPE html>
    <html lang="ru">
    <head>
    </head>
    <body style="text-align:center;">
        Ошибка {{ status_code }}<br>
        {{ status_text }}
    </body>
    </html>

{% endif %}

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

Надеюсь этот небольшой рецепт по Symfony2 был полезен вам.

Теги: #Symfony2, #404

Ваша оценка:

Рейтинг: 9.5 (Оценок: 2)

Комментарии (1):

stingmu
2015-06-21 14:32
Зачем так усложнять всё??? В development окружении по-умолчанию остаётся обычный вывод ошибки с дебаг панелью. И не нужен никакой велосипед с проверкой окружения... В Symfoyn 2.6 даже добавили специальную возможность для просмотра страниц ошибок в dev окружении так, как они будут видны в production:
http://symfony.com/blog/new-in-symfony-2-6-error-page-previews

Комментарий:

Copyright © DOC_tr 2015-2017 г. Все права защищены
Яндекс.Метрика
Перейти к мобильной версии