Skip to content
SensioLabs

SensioLabs is the creator of Symfony and plays a pivotal role in supporting its growth. With a passionate team pushing the boundaries of PHP, SensioLabs helps organizations get the most out of Symfony through quality, high-performance, software vendor-level training and consulting services.

In the Spotlight

Blogs

    Symfony, SensioLabs, Insight, and Blackfire.

How to Dynamically Configure Form Validation Groups

Warning: You are browsing the documentation for Symfony 3.x, which is no longer maintained.

Read the updated version of this page for Symfony 7.3 (the current stable version).

Sometimes you need advanced logic to determine the validation groups. If they can't be determined by a simple callback, you can use a service. Create a service that implements __invoke() which accepts a FormInterface as a parameter:

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 = [];

        // ... determine which groups to apply and return an array

        return $groups;
    }
}

Then in your form, inject the resolver and set it as the 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([
            'validation_groups' => $this->groupResolver,
        ]);
    }
}

This will result in the form validator invoking your group resolver to set the validation groups returned when validating.

This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.
TOC
    Version