Исключение ValidationFailedException
Исключение ValidationFailedException выбрасывается
сервисом validator, когда переданные данные не проходят
проверку по заданным ограничениям. Первым параметром
передаётся объект, который не прошёл валидацию, вторым -
объект ConstraintViolationListInterface со списком
всех найденных нарушений. Исключение удобно перехватывать
в контроллере, чтобы вернуть пользователю понятный ответ
с перечнем ошибок.
Синтаксис
new ValidationFailedException(mixed $value, ConstraintViolationListInterface $violations)
Пример
Давайте создадим сущность с ограничением и попробуем провалидировать пустое значение:
<?php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class Article
{
#[Assert\NotBlank]
#[Assert\Length(min: 3)]
public string $title = '';
}
?>
Теперь провалидируем объект и перехватим исключение:
<?php
namespace App\Controller;
use App\Entity\Article;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Validator\Exception\ValidationFailedException;
use Symfony\Component\Validator\Validation;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_index')]
public function index(): Response
{
$article = new Article();
$validator = Validation::createValidatorBuilder()
->enableAttributeMapping()
->getValidator();
$violations = $validator->validate($article);
try {
if (count($violations) > 0) {
throw new ValidationFailedException($article, $violations);
}
return new Response('valid');
} catch (ValidationFailedException $e) {
$messages = [];
foreach ($e->getViolations() as $violation) {
$messages[] = $violation->getMessage();
}
return new Response(implode(', ', $messages));
}
}
}
?>
Результат выполнения кода:
"This value should not be blank., This value is too short. It should have 3 characters or more."
Пример
Давайте получим объект с нарушениями через метод
getViolations и выведем количество ошибок:
<?php
namespace App\Controller;
use App\Entity\Article;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Validator\Exception\ValidationFailedException;
use Symfony\Component\Validator\Validation;
class ArticleController extends AbstractController
{
#[Route('/article/count', name: 'article_count')]
public function count(): Response
{
$article = new Article();
$validator = Validation::createValidatorBuilder()
->enableAttributeMapping()
->getValidator();
$violations = $validator->validate($article);
try {
if (count($violations) > 0) {
throw new ValidationFailedException($article, $violations);
}
return new Response('0');
} catch (ValidationFailedException $e) {
return new Response((string) count($e->getViolations()));
}
}
}
?>
Результат выполнения кода:
"2"
Смотрите также
-
исключение
UnprocessableEntityHttpException,
которое возвращает код 422 при ошибках валидации -
исключение
BadRequestHttpException,
которое сигнализирует о некорректном запросе -
исключение
InvalidArgumentException,
которое выбрасывается при неверных аргументах -
исключение
HttpException,
которое является базой для HTTP-исключений