РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
557 of 1361 menu

Исключение 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-исключений
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить