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

Правило Valid

Правило Valid вешается на поле формы, которое содержит вложенный объект или массив объектов. Оно указывает Symfony, что при валидации родительской формы нужно также проверить вложенные объекты по правилам, заданным в их классах через атрибуты Assert. Без этого правила ограничения вложенной сущности игнорируются.

Синтаксис

use Symfony\Component\Validator\Constraints\Valid; #[Valid]

Пример

Давайте создадим сущность Address с правилом NotBlank на поле city:

<?php namespace App\Entity; use Symfony\Component\Validator\Constraints as Assert; class Address { #[Assert\NotBlank] private string $city = ''; public function getCity(): string { return $this->city; } public function setCity(string $city): self { $this->city = $city; return $this; } } ?>

Теперь создадим форму AddressType для этой сущности:

<?php namespace App\Form; use App\Entity\Address; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; class AddressType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder->add('city', TextType::class); } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => Address::class, ]); } } ?>

Создадим сущность User, которая содержит вложенный объект Address:

<?php namespace App\Entity; class User { private string $name = ''; private ?Address $address = null; public function getName(): string { return $this->name; } public function setName(string $name): self { $this->name = $name; return $this; } public function getAddress(): ?Address { return $this->address; } public function setAddress(?Address $address): self { $this->address = $address; return $this; } } ?>

Теперь построим форму UserType, у которой поле address вложено через AddressType. Чтобы ограничения вложенной сущности проверялись, навесим на это поле правило Valid:

<?php namespace App\Form; use App\Entity\User; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Validator\Constraints\Valid; class UserType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder->add('name', TextType::class); $builder->add('address', AddressType::class, [ 'constraints' => [ new Valid(), ], ]); } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => User::class, ]); } } ?>

Обработаем форму в контроллере и выведем ошибки валидации:

<?php namespace App\Controller; use App\Entity\Address; use App\Entity\User; use App\Form\UserType; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; class UserController extends AbstractController { #[Route('/user', name: 'user_form')] public function index(Request $request): Response { $user = new User(); $user->setAddress(new Address()); $form = $this->createForm(UserType::class, $user); $form->handleRequest($request); $res = ''; if ($form->isSubmitted() && $form->isValid()) { $res = 'valid'; } else { foreach ($form->getErrors(true) as $error) { $res .= $error->getMessage() . ' '; } } return new Response($res); } } ?>

Если отправить форму с пустым полем city, правило Valid заставит Symfony проверить вложенный объект Address и вернуть ошибку. Результат выполнения кода:

"This value should not be blank."

Смотрите также

  • метод isValid,
    который проверяет валидность формы
  • правило NotBlank,
    которое требует непустое значение поля
  • правило Collection,
    которое валидирует коллекцию вложенных элементов
  • правило All,
    которое применяет ограничения ко всем элементам коллекции
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить