Як динамічно конфігурувати групи валідації форм

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

Як динамічно конфігурувати групи валідації форм

Іноді вам потрібна просунута логіка, щоб визначати групи валідації. Якщо вони не можуть бути визначені зворотним викликом, ви можете використати сервіс. Створіть сервіс, що реалізує __invoke(), який приймає FormInterface в якості параметра:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// src/Validation/ValidationGroupResolver.php
namespace App\Validation;

use Symfony\Component\Form\FormInterface;

class ValidationGroupResolver
{
    private $service1;

    private $service2;

    public function __construct($service1, $service2)
    {
        $this->service1 = $service1;
        $this->service2 = $service2;
    }

    public function __invoke(FormInterface $form): array
    {
        $groups = [];

        // ... визначити, які групи застосувати, та повернути масив

        return $groups;
    }
}

Потім, у вашій формі, впровадьте розвʼязувач, та встановіть його як validation_groups:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// src/Form/MyClassType.php;
namespace App\Form;

use App\Validation\ValidationGroupResolver;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class MyClassType extends AbstractType
{
    private $groupResolver;

    public function __construct(ValidationGroupResolver $groupResolver)
    {
        $this->groupResolver = $groupResolver;
    }

    // ...
    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'validation_groups' => $this->groupResolver,
        ]);
    }
}

Це призведе до того, що валідатор форми викликатиме ваш розвʼязувач групи, щоб встановити групи валідації, які будуть повертатися при валідації.