Исключение UnprocessableEntityHttpException
Исключение UnprocessableEntityHttpException относится к группе HTTP-исключений Symfony и соответствует статус-коду 422 Unprocessable Entity. Оно выбрасывается тогда, когда запрос синтаксически корректен, но содержит данные, которые сервер не в состоянии обработать: например, неверно заполненную форму, некорректные бизнес-правила или несоответствие типов. Конструктор принимает первым параметром сообщение об ошибке, вторым - предыдущее исключение, третьим - код ошибки, четвёртым - массив заголовков ответа.
Синтаксис
new UnprocessableEntityHttpException(
string $message = '',
Throwable $previous = null,
int $code = 0,
array $headers = []
)
Пример
Давайте выбросим исключение UnprocessableEntityHttpException в контроллере, если пришедшие данные не проходят проверку:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpKernelExceptionUnprocessableEntityHttpException;
class ArticleController extends AbstractController
{
public function create(Request $request): Response
{
$title = $request->request->get('title');
if (empty($title)) {
throw new UnprocessableEntityHttpException('Title is required');
}
return new Response('Article created');
}
}
?>
Если отправить запрос без поля title, Symfony вернёт ответ со статусом 422 и текстом исключения.
Пример
Давайте перехватим исключение и вернём клиенту JSON с описанием ошибки:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationJsonResponse;
use SymfonyComponentHttpKernelExceptionUnprocessableEntityHttpException;
class ArticleController extends AbstractController
{
public function validate(): JsonResponse
{
try {
throw new UnprocessableEntityHttpException('Invalid data');
} catch (UnprocessableEntityHttpException $e) {
return new JsonResponse([
'error' => $e->getMessage(),
'status' => $e->getStatusCode()
], $e->getStatusCode());
}
}
}
?>
Результат выполнения кода:
{"error":"Invalid data","status":422}
Пример
Давайте передадим собственные заголовки вместе с исключением:
<?php
namespace AppController;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpKernelExceptionUnprocessableEntityHttpException;
class ArticleController extends AbstractController
{
public function store(): Response
{
throw new UnprocessableEntityHttpException(
'Validation failed',
null,
0,
['X-Error-Code' => 'VALIDATION_FAILED']
);
}
}
?>
В ответе появится заголовок X-Error-Code: VALIDATION_FAILED, а статус будет равен 422.
Смотрите также
-
исключение
HttpException,
базовый класс для всех HTTP-исключений Symfony -
исключение
BadRequestHttpException,
которое соответствует ошибке 400 -
исключение
ValidationFailedException,
которое выбрасывается при неудачной валидации -
метод
getStatusCode,
который возвращает HTTP-код исключения