Utiliser des groupes de validation différents en fonction du bouton submit cliqué

Lors de la validation d'un formulaire, le besoin peut être de valider différemment les données selon le bouton cliquer lors de la soumission du formulaire. L'option validation_groups prend habituellement un tableau de groupes de validation mais accepte également une fonction de callback. Ce callback prend FormInterface en paramètre permettant d'y placer une logique dépendante de l'état du formulaire.

Comme par exemple, le bouton sur lequel l'utilisateur a cliqué :

<?php

namespace Acme\Bundle\AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class FoobarType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('foobar', 'text')
            ->add('barfoo', 'text')
            ->add('save', 'submit')
            ->add('save_and_publish', 'submit');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'validation_groups' => function(FormInterface $form) {

                // If save_and_publish button is clicked, use "SaveAndPublish" validation group
                if ($form->get('save_and_publish')->isClicked()) {
                    return ['SaveAndPublish'];
                }

                // Else use "Default" validation group
                return ['Default'];
            }
        ));
    }

    public function getName()
    {
        return 'foobar';
    }
}

Les commentaires