En travaillant récemment avec Symfony2 et l’excellent FOSUserBundle, j’ai été amené à mettre en place un CAPTCHA à l’inscription.

Possédant mon propre bundle de Captcha (GregwarCaptchaBundle), je vous écrit un article qui vous explique comment faire marcher les deux ensemble.

Le principe est d’écrire votre propre formulaire d’inscription qui surchargera celui de FOS, voici le code :

namespace Something\Bundle\Form;

use Symfony\Component\Form\FormBuilderInterface;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;

class RegistrationType extends BaseType
{
    public function buildForm(FormBuilderInterface $builder,
                                           array $options)
    {
        parent::buildForm($builder, $options);

        $builder->add('captcha', 'captcha', array(
            'label' => 'Code visuel :'
        ));
    }

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

Enregistrez maintenant votre type dans votre configuration en tant que service :

# config.yml

services:
    something.registration.form.type:
        class: Something\BundleForm\RegistrationType
        arguments: [%fos_user.model.user.class%]
        tags:
            - { name: form.type, alias: somethingbundle_user_registration }

Après cela, enregistrez votre formulaire auprès de la configuration de FOSUserBundle pour lui dire qu’il faudra utiliser votre formulaire au lieu du sien :

# config.yml

fos_user:
    registration:
        form:
            type: somethingbundle_user_registration

Voila! Votre inscription contiendra alors un code visuel