NotFoundHttpException
Исключение NotFoundHttpException является частью HTTP-исключений Laravel и генерируется, когда входящий запрос не может быть сопоставлен ни с одним зарегистрированным маршрутом или когда ресурс не найден. Это стандартный способ обработки ошибок 404 в приложении. Исключение автоматически обрабатывается обработчиком исключений и возвращает ответ с HTTP-статусом 404.
Синтаксис
Исключение обычно не вызывается вручную, а генерируется автоматически маршрутизатором или при использовании метода findOrFail. Однако его можно выбросить вручную с помощью вспомогательной функции abort:
<?php
abort(404, 'Custom error message');
?>
Пример
Рассмотрим автоматическое возникновение исключения при обращении к несуществующему маршруту:
<?php
use Illuminate\Support\Facades\Route;
Route::get('/users', function () {
return 'Users list';
});
// Запрос на /posts вызовет NotFoundHttpException
?>
При попытке перейти по адресу /posts, которого нет в маршрутах, Laravel автоматически выбрасывает исключение:
<!DOCTYPE html>
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>404</h1>
<p>Not Found</p>
</body>
</html>
Пример
Использование метода findOrFail для модели Eloquent при отсутствии записи:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function show($id)
{
// Если пользователь с таким ID не найден, будет выброшено NotFoundHttpException
$user = User::findOrFail($id);
return response()->json($user);
}
}
?>
Результат при запросе несуществующего пользователя (например, ID = 999):
{
"message": "No query results for model [App\\Models\\User] 999",
"exception": "NotFoundHttpException"
}
Пример
Ручная генерация исключения с помощью вспомогательной функции abort в контроллере:
<?php
namespace App\Http\Controllers;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function show($slug)
{
$post = Post::where('slug', $slug)->first();
if (!$post) {
abort(404, 'Post not found');
}
return view('posts.show', ['post' => $post]);
}
}
?>
Результат выполнения кода при отсутствии поста:
"Post not found"
Пример
Кастомизация страницы ошибки 404 в Laravel. Для этого создайте файл resources/views/errors/404.blade.php:
<!DOCTYPE html>
<html>
<head>
<title>Страница не найдена</title>
</head>
<body>
<h1>404 - Страница не найдена</h1>
<p>Извините, запрашиваемая страница не существует.</p>
<p>Вернитесь на <a href="{{ url('/') }}">главную</a>.</p>
</body>
</html>
Теперь при возникновении NotFoundHttpException будет отображаться кастомная страница.
Смотрите также
-
класс
Handler,
который обрабатывает все исключения в приложении -
исключение
HttpException,
базовый класс для всех HTTP-исключений -
исключение
ModelNotFoundException,
которое выбрасывается при отсутствии модели -
метод
render,
который преобразует исключение в HTTP-ответ