How to Choose Validation Groups Based on the Submitted Data

If you need some advanced logic to determine the validation groups (e.g. based on submitted data), you can set the validation_groups option to an array callback:

検証グループを決定するための高度なロジックが必要な場合 (送信されたデータに基づくなど)、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',
        ],
    ]);
}

This will call the static method determineValidationGroups() on the Client class after the form is submitted, but before validation is invoked. The Form object is passed as an argument to that method (see next example). You can also define whole logic inline by using a Closure:

これにより、フォームが送信された後、検証が呼び出される前に、クライアント クラスで静的メソッドの defineValidationGroups() が呼び出されます。 Form オブジェクトは引数としてそのメソッドに渡されます (次の例を参照)。クロージャーを使用して、ロジック全体をインラインで定義することもできます。
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) {
            $data = $form->getData();

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

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

Using the validation_groups option overrides the default validation group which is being used. If you want to validate the default constraints of the entity as well you have to adjust the option as follows:

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) {
            $data = $form->getData();

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

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

You can find more information about how the validation groups and the default constraints work in the article about validation groups.

検証グループと既定の制約がどのように機能するかについての詳細は、検証グループに関する記事を参照してください。