Я думаю, что уже ни для кого не секрет, что 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-компонентов страницу с красивым сообщением.

Комментарии (17)


  1. gtwenty
    30.11.2023 11:41
    +1

    Как-то колхозно. Может, лучше вернуть кастомную вьюху?


    1. igramnet Автор
      30.11.2023 11:41
      -1

      А как сделать кастомную вьюху, да ещё и так, чтобы она обрабатывала blade-компоненты?


  1. deamondz
    30.11.2023 11:41
    +1

    Пользователь словил 500, хочет вернуться на страницу, предшествующую упавшей, нажав кнопку назад. Вместо предыдущей работающей страницы, пользователь опять попадает на /500

    правильно я понимаю логику?


    1. igramnet Автор
      30.11.2023 11:41
      -1

      На 500-ой никто не отправляет пользователя назад. Если он нажмет в браузере назад, то да, его вернет на 500-ку. Как вариант, можно добавить обработку предыдущего линка и в шаблоне добавить кнопку "Назад" и возвращать пользователя правильно. Хорошее предложение.


      1. deamondz
        30.11.2023 11:41
        +3

        браузерные кнопки назад и вперёд отменили?

        кмк отправлять пользователя принудительно на /500 - антипаттерн


  1. catmodecode
    30.11.2023 11:41

    А если 500 из вьюхи пришла? Меню например из базы которая упала. Или 500 на сервисах


    1. igramnet Автор
      30.11.2023 11:41
      -1

      Я тут не знаю, предполагаю, что VUE сама умеет обрабатывать ошибки. Есть ещё у Sentry SDK для JavaScript. Можно её использовать.


      1. catmodecode
        30.11.2023 11:41
        +2

        Я про view, про блейды.
        Ну и сходу зачем редирект делать? Почему бы не сделать сразу return response()->view()? Так не будут работать x-slot?


        1. igramnet Автор
          30.11.2023 11:41

          Ваше предложение лучше. Позволяет избежать редиректы. Обновил тело статьи.


          1. FanatPHP
            30.11.2023 11:41

            Не понял, а исходно там был редирект? То есть страница ошибки возвращала не 500, а 302? Серьёзно?


      1. FanatPHP
        30.11.2023 11:41

        Не понял, а при чем здесь VUE? Ведь мы говорили вроде бы про рендеринг на сервере? Да, VUE умеет. но зачем тогда вообще было затеваться со "сверстанной из blade-компонентов страницей"?


  1. PiramidHead
    30.11.2023 11:41
    +2

    Не совсем понятно, для чего эта статья. Обработка ошибок, отображение кастомных вьюх и многое другое - всё подробно описано в разделе Error Handling официальной документации.


    1. igramnet Автор
      30.11.2023 11:41
      -2

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


      1. DarKsandr
        30.11.2023 11:41

        Laravel упрощает отображение пользовательских страниц ошибок для различных кодов состояния HTTP. Например, чтобы настроить страницу ошибок для кодов состояния HTTP 404, создайте resources/views/errors/404.blade.phpшаблон представления. Это представление будет отображаться для всех ошибок 404, сгенерированных вашим приложением. Представления в этом каталоге должны иметь имена, соответствующие коду состояния HTTP, которому они соответствуют.

        https://laravel.com/docs/10.x/errors#custom-http-error-pages

        Цитата из официальной документации, по аналогии так же создаёшь и для 500


        1. igramnet Автор
          30.11.2023 11:41
          -1

          Все так, но вы попробуйте использовать blade-шаблону с компонентами x-slot. У вас не получится ничего. В моём случае это возможно.


      1. PiramidHead
        30.11.2023 11:41
        +2

        Все исключения обрабатываются классом App\Exceptions\Handler. Этот класс содержит метод register, в котором вы можете зарегистрировать свои отчеты об исключениях и замыкания рендеринга. Отчеты об исключениях используются для регистрации исключений или отправки их во внешнюю службу, например Flare, Bugsnag или Sentry.

        Вы можете использовать метод reportable для регистрации замыкания, которое должно быть выполнено, когда необходимо сообщить об исключении конкретного типа

        Что касается view:

        По умолчанию обработчик исключений Laravel будет преобразовывать исключения в HTTP-ответ за вас. Однако вы можете зарегистрировать свое замыкание для отображения исключений конкретного типа. Вы можете сделать это с помощью метода renderable обработчика исключений.

        public function register()
        {
            $this->renderable(function (InvalidOrderException $e, $request) {
                return response()->view('errors.invalid-order', [], 500);
            });
        }


        1. igramnet Автор
          30.11.2023 11:41
          -2

          И буду работать x-slot в шаблонах?

          Если так, то выглядит интереснее.