abort() кидає HttpException з указаним кодом - обробник винятків перетворює його на відповідь з цим статусом:
abort(404);
abort(403, 'Цей проєкт архівовано.');
abort_if(! $user->isAdmin(), 403);
abort_unless($post->isPublished(), 404);
Після abort() код далі не виконується - це виняток, а не return.
Коли що використовувати:
- 404 - ресурсу немає чи користувачу не можна знати, що він існує;
- 403 - ресурс є, але доступ заборонено. Для перевірки прав краще політики (
$this->authorize(),Gate) - вони кидають той самий 403, але логіка прав зібрана в одному місці; findOrFail()замість ручногоabort(404)післяfind()- коротше й без забутої перевірки.
Власні сторінки помилок - просто Blade-шаблони за кодом статусу:
resources/views/errors/404.blade.php
resources/views/errors/403.blade.php
resources/views/errors/500.blade.php
resources/views/errors/503.blade.php # режим обслуговування
Усередині доступний виняток:
<h1>{{ $exception->getMessage() ?: 'Сторінку не знайдено' }}</h1>
Запасні сторінки для групи кодів: 4xx.blade.php і 5xx.blade.php використовуються, якщо немає шаблону для конкретного коду.
Стандартні шаблони Laravel можна скопіювати як основу:
php artisan vendor:publish --tag=laravel-errors
Типові пастки:
- сторінка 500 не повинна залежати від того, що могло зламатися: запитів до бази, сесії, складних компонентів. Якщо помилку спричинила база, сторінка помилки, що звертається до бази, впаде теж;
- повідомлення в
abort(403, '...')бачить користувач - жодних технічних деталей; - для API шаблони не використовуються: при
Accept: application/jsonLaravel повертає{"message": "..."}з відповідним статусом.
Докладніше в документації: Помилки: власні сторінки HTTP-помилок