Правило 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,
которое применяет ограничения ко всем элементам коллекции