http://symfony.com/doc/current/book/validation.html#book-validation-validation-groups
Even better, you can determine which validation group should be applied based on the value filled in form by user:
http://symfony.com/doc/current/book/forms.html#groups-based-on-the-submitted-data
Let's say we have a Product entity. Product entity has a 2 properties: description and category.
Depending on the "category "property different validation groups can be applied to 'description'. Symfony defines a group called "Default" in which are included all the validation which are not marked as part of any group.
<?php class Product { /** * @var string * * @ORM\Column(name="description", type="text", nullable=false) * @Assert\NotNull(groups={"imported"}) */ protected $description; protected $category; }
I marked the NotNull validation as being part of "imported" group.
Now in the form class using the Product entity I need to put the logic based on which the validation groups are used:
<?php use AppBundle\Entity\Product; use Symfony\Component\Form\FormInterface; use Symfony\Component\OptionsResolver\OptionsResolver; class ProductType extends AbstractType { /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { .... } // ... public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults(array( 'validation_groups' => function (FormInterface $form) { $data = $form->getData(); if ($data->getCategory() === 'Exotic fruits' ) { return array('Default', 'imported'); } return array('Default'); }, )); } }
The code above basically says :
- if category is "Exotic fruits" than apply "Default" and "imported" validations.
- otherwise apply only "Default" validations
Sometimes you need advanced logic to determine the validation groups. If they can't be determined by a simple callback, you can use a service: http://symfony.com/doc/current/cookbook/validation/group_service_resolver.html