How to Dynamically Configure Form Validation Groups
Warning: You are browsing the documentation for Symfony 5.x, which is no longer maintained.
Read the updated version of this page for Symfony 7.2 (the current stable version).
Sometimes you need advanced logic to determine the validation groups. If they
can't be determined by a 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
// 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 = [];
// ... 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/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,
]);
}
}
This will result in the form validator invoking your group resolver to set the validation groups returned when validating.