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

При создании сайта разработчику просто необходимо знать о всех ошибках которые возникают у него на сайте, и 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 был полезен вам.

[Всего голосов: 0    Средний: 0/5]

Добавить комментарий

Ваш e-mail не будет опубликован.