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

Дата обновления перевода 2023-09-04

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

Если вам нужна продвинутая логика, чтобы определить группы валидации (наример, основанные на отправленных данных), вы можете установить опцию 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): void
{
    $resolver->setDefaults([
        'validation_groups' => [
            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): void
{
    $resolver->setDefaults([
        'validation_groups' => function (FormInterface $form): array {
            $data = $form->getData();

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

            return ['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): void
{
    $resolver->setDefaults([
        'validation_groups' => function (FormInterface $form): array {
            $data = $form->getData();

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

            return ['Default', 'company'];
        },
    ]);
}

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