Pull to refresh

Как сделасть кастомную 500-ую страницу в Laravel и пробрасывать ошибки в Sentry

Level of difficultyEasy
Reading time2 min
Views2.2K

Я думаю, что уже ни для кого не секрет, что Sentry - классная штука в разработке. Есть отличное облако с бесплатным тарифом, куча компонентов для внедрения Sentry во фреймворки.

Задача: сделать красивую 500-ую ошибку на проекте, написанном на Laravel

Решений в интернете куча. Но если у вас страница с 500-ой ошибкой реализована через blade-компоненты. Как быть? Обычные методы не работали, потому как срабатывает 500-ая ошибка и рендеринг blade-шаблонов не происходит. Можно конечно сверстать 500-ку на чистом HTML/CSS, но это супер неудобно.

Подзадача: пробрасывать все ошибки, возникшие в blade-шаблоне в sentry

Решение подзадачи помогло найти решение общей задачи. Я добавил код в app/Exceptions/Handler.php

    public function render($request, Throwable $e)
    {
        if ($this->shouldReport($e)) {
            Integration::captureUnhandledException($e);
        }
        parent::render($request, $e);
    }

И вуаля - ошибки сыпятся в Sentry. Класс, теперь я знаю, что есть проблемы на сайте. Но все равно выскакивает 500-ка. А это плохо.

А вот добавим отображение нужного шаблона, можно сразу показать красивую 500-ую ошибку.

    public function render($request, Throwable $e)
    {
        if ($this->shouldReport($e)) {
            Integration::captureUnhandledException($e);
            return response()->view('errors.500');
        }
        parent::render($request, $e);
    }

Теперь в Senty получаю ошибку, а пользователь видит сверстанную из blade-компонентов страницу с красивым сообщением.

А если добавить вот так, то будет корректно работать 404-ая и 500-ка.

    public function render($request, Throwable $e)
    {

        if ($e instanceof ModelNotFoundException) {
            return response()->view('errors.404', [], 404);
        }

        if ($this->shouldReport($e)) {
            Integration::captureUnhandledException($e);
            return response()->view('errors.500');
        }
        return parent::render($request, $e);
    }

Не забудьте подключить в файле

use Illuminate\Database\Eloquent\ModelNotFoundException;

Tags:
Hubs:
Total votes 9: ↑4 and ↓5-1
Comments17

Articles