Як обирати групи валідації, засновані на відправлених даних

Дата оновлення перекладу 2022-11-20

Як обирати групи валідації, засновані на відправлених даних

Якщо вам потрібна просунута логіка, щоб визначити групи валідації (наприклад, засновані на відправлених даних), ви можете встановити опцію 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 після того, як форма буде відправлена, але до виконання валідації. Обʼєкт Форма передається в якості аргументу до цього методу (дивіться наступний приклад). Ви можете також визначити всю логіку лінійно, використовуючи 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');
        },
    ));
}

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