HttpResponseException
Класс HttpResponseException предназначен для прерывания нормального потока выполнения приложения и немедленной отправки сформированного HTTP-ответа клиенту. В конструктор исключения передаётся объект ответа Response, который будет отправлен пользователю. Это особенно полезно в middleware, контроллерах или сервисных классах, когда требуется быстро вернуть JSON-данные, редирект или представление без выполнения дальнейшего кода.
Синтаксис
<?php
throw new HttpResponseException($response);
?>
Параметр $response может быть экземпляром классов Response, JsonResponse или RedirectResponse.
Пример
Вернём JSON-ответ с ошибкой авторизации прямо из контроллера:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Exceptions\HttpResponseException;
class UserController extends Controller
{
public function profile(Request $request)
{
if (!$request->user()) {
$response = new JsonResponse([
'error' => 'User not authenticated'
], 401);
throw new HttpResponseException($response);
}
return $request->user();
}
}
?>
Результат выполнения кода при отсутствии пользователя:
{
"error": "User not authenticated"
}
Пример
Применим исключение в middleware для проверки прав доступа и перенаправления:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Exceptions\HttpResponseException;
class CheckAgeMiddleware
{
public function handle(Request $request, Closure $next)
{
if ($request->input('age') < 18) {
$redirect = new RedirectResponse('/underage');
throw new HttpResponseException($redirect);
}
return $next($request);
}
}
?>
После выбрасывания исключения пользователь будет перенаправлен на страницу '/underage' без выполнения остальных действий в запросе.
Пример
Вернём HTML-представление в качестве ответа при ошибке валидации в сервисном классе:
<?php
namespace App\Services;
use Illuminate\Http\Response;
use Illuminate\Http\Exceptions\HttpResponseException;
use Illuminate\Support\Facades\View;
class PostService
{
public function create(array $data)
{
if (empty($data['title'])) {
$html = View::make('errors.custom', [
'message' => 'Title is required'
])->render();
$response = new Response($html, 400);
throw new HttpResponseException($response);
}
// Логика сохранения поста
return true;
}
}
?>
Результат выполнения кода при пустом заголовке:
<!-- Содержимое представления errors.custom -->
<div>Error: Title is required</div>
Смотрите также
-
исключение
HttpException,
которое используется для генерации стандартных HTTP-ошибок с кодом состояния -
исключение
NotFoundHttpException,
которое выбрасывается при отсутствии ресурса -
исключение
AccessDeniedHttpException,
которое сигнализирует о недостатке прав доступа -
класс
Handler,
который отвечает за обработку всех исключений в приложении