Как сконфигурировать динамические группы валидации

Иногда вам будет нужна усложнённая логика, чтобы определить группы валидации. Если их нельзя определить простым обратным вызовом (callback), то вы можете использовать сервис. Создайте сервис, реализующий __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
27
28
29
30
// src/AppBundle/Validation/ValidationGroupResolver.php
namespace AppBundle\Validation;

use Symfony\Component\Form\FormInterface;

class ValidationGroupResolver
{
    private $service1;

    private $service2;

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

    /**
     * @param FormInterface $form
     * @return array
     */
    public function __invoke(FormInterface $form)
    {
        $groups = array();

        // ... определите, какие группы применить и вернуть в качестве массива

        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/AppBundle/Form/MyClassType.php;
namespace AppBundle\Form;

use AppBundle\Validator\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)
    {
        $resolver->setDefaults(array(
            'validation_groups' => $this->groupResolver,
        ));
    }
}

Это приведёт к тому, что форма валидатора вызовет распознавателя групп, чтобы установить группы валидации, которые возвращаются при валидации.

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