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

Если вам нужна продвинутая логика, чтобы определить группы валидации (наример, основанные на отправленных данных), вы можете установить опцию 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');
        },
    ));
}

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

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.