Я думаю, что уже ни для кого не секрет, что 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)
deamondz
30.11.2023 11:41+1Пользователь словил 500, хочет вернуться на страницу, предшествующую упавшей, нажав кнопку назад. Вместо предыдущей работающей страницы, пользователь опять попадает на /500
правильно я понимаю логику?
igramnet Автор
30.11.2023 11:41-1На 500-ой никто не отправляет пользователя назад. Если он нажмет в браузере назад, то да, его вернет на 500-ку. Как вариант, можно добавить обработку предыдущего линка и в шаблоне добавить кнопку "Назад" и возвращать пользователя правильно. Хорошее предложение.
deamondz
30.11.2023 11:41+3браузерные кнопки назад и вперёд отменили?
кмк отправлять пользователя принудительно на /500 - антипаттерн
catmodecode
30.11.2023 11:41А если 500 из вьюхи пришла? Меню например из базы которая упала. Или 500 на сервисах
igramnet Автор
30.11.2023 11:41-1Я тут не знаю, предполагаю, что VUE сама умеет обрабатывать ошибки. Есть ещё у Sentry SDK для JavaScript. Можно её использовать.
catmodecode
30.11.2023 11:41+2Я про view, про блейды.
Ну и сходу зачем редирект делать? Почему бы не сделать сразу return response()->view()? Так не будут работать x-slot?
FanatPHP
30.11.2023 11:41Не понял, а при чем здесь VUE? Ведь мы говорили вроде бы про рендеринг на сервере? Да, VUE умеет. но зачем тогда вообще было затеваться со "сверстанной из blade-компонентов страницей"?
PiramidHead
30.11.2023 11:41+2Не совсем понятно, для чего эта статья. Обработка ошибок, отображение кастомных вьюх и многое другое - всё подробно описано в разделе Error Handling официальной документации.
igramnet Автор
30.11.2023 11:41-2Я в офциально документации не нашел, как пробрасывать ошибки шаблонов Sentry, но допускаю, что не все дочитал. А вот как заставить показывать кастомный шаблон 500-ки с использованием blade-компонентов - задача для меня была нерешена уже более месяца. А здесь получилось найти такое решение.
DarKsandr
30.11.2023 11:41Laravel упрощает отображение пользовательских страниц ошибок для различных кодов состояния HTTP. Например, чтобы настроить страницу ошибок для кодов состояния HTTP 404, создайте
resources/views/errors/404.blade.php
шаблон представления. Это представление будет отображаться для всех ошибок 404, сгенерированных вашим приложением. Представления в этом каталоге должны иметь имена, соответствующие коду состояния HTTP, которому они соответствуют.https://laravel.com/docs/10.x/errors#custom-http-error-pages
Цитата из официальной документации, по аналогии так же создаёшь и для 500
igramnet Автор
30.11.2023 11:41-1Все так, но вы попробуйте использовать blade-шаблону с компонентами x-slot. У вас не получится ничего. В моём случае это возможно.
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); }); }
igramnet Автор
30.11.2023 11:41-2И буду работать x-slot в шаблонах?
Если так, то выглядит интереснее.
gtwenty
Как-то колхозно. Может, лучше вернуть кастомную вьюху?
igramnet Автор
А как сделать кастомную вьюху, да ещё и так, чтобы она обрабатывала blade-компоненты?