Как выбирать группы валидации, основанные на отправленных данных

Как выбирать группы валидации, основанные на отправленных данных

Если вам нужна продвинутая логика, чтобы определить группы валидации (наример, основанные на отправленных данных), вы можете установить опцию validation_groups в обратном вызове массива:

1
2
3
4
5
6
7
8
9
10
11
12
13
use App\Entity\Client;
use Symfony\Component\OptionsResolver\OptionsResolver;

// ...
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'validation_groups' => array(
            Client::class,
            'determineValidationGroups',
        ),
    ));
}

Это вызовет статически метод determineValidationGroups() в классе Client после того, как форма будет отправлена, но до выполнения валидации. Объект Form (форма) передаётся в качестве аргумента к этому методу (смотрите следующий пример). Вы также можете определить всю логику линейно, используя Closure:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use App\Entity\Client;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

// ...
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'validation_groups' => function (FormInterface $form) {
            $data = $form->getData();

            if (Client::TYPE_PERSON == $data->getType()) {
                return array('person');
            }

            return array('company');
        },
    ));
}

Использование опции validation_groups переопределяет используемую по умолчанию группу валидации. Если вы также хотите валидировать ограничения сущности по умолчанию, то вам нужно настроить опцию следующим образом:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use App\Entity\Client;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

// ...
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'validation_groups' => function (FormInterface $form) {
            $data = $form->getData();

            if (Client::TYPE_PERSON == $data->getType()) {
                return array('Default', 'person');
            }

            return array('Default', 'company');
        },
    ));
}

Вы можете найти больше информации о том, как работают группы валидации и ограничения по умолчанию в статье о Группах валидации.