Mini série: réalisation du formulaire d'inscription (partie 3/5)

publié le 27/02/2018

symfony 4 formulaire d'inscription

Au terme des parties 1 et 2, le formulaire de connexion fonctionne et nos membres sont récupérés depuis la base de données grâce à l'entité User. Dans cette partie, nous allons réaliser le formulaire d'inscription. Comme à chaque fois, je mettrai en lien le dépôt Github du projet en cours afin que vous puissiez récupérer le code facilement.


Partie 3: le formulaire d'inscription

Ajout de la propriété plainPassword sur l'entité User

Pour commencer, modifions légèrement notre entité pour que l'internaute puisse saisir son mot de passe en clair:

<?php
// src/Entity/User.php
namespace App\Entity;
 
// ...
class User implements UserInterface, \Serializable {
 
// ...
    /**
     * @Assert\NotBlank(groups={"registration"})
     * @Assert\Length(max=4096)
     */
    private $plainPassword;
 
    public function getPlainPassword()
    {
        return $this->plainPassword;
    }
 
    public function setPlainPassword($password)
    {
        $this->plainPassword = $password;
    }
 
// ...
}

Nous ajoutons ici la propriété plainPassword. Cette propriété n'est pas enregistrée en base car ce champ contient le mot de passe en clair, c'est à dire qu'il n'est pas crypté. La contrainte NotBlank(groups={"registration"}) signifie que dans un contexte d'inscription, ce champ est obligatoire.


Création du formulaire

<?php
namespace App\Form;
 
use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
 
class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email', EmailType::class)
            ->add('username', TextType::class, [
                'label' => 'Identifiant'
            ])
            ;
 
        if (in_array('registration', $options['validation_groups'])) {
            $builder
                ->add('plainPassword', RepeatedType::class, array(
                    'type' => PasswordType::class,
                    'first_options'  => array('label' => 'Mot de passe'),
                    'second_options' => array('label' => 'Confirmer le mot de passe'),
                ))
                ;
        } else {
            $builder
                ->add('plainPassword', RepeatedType::class, array(
                    'required' => false,
                    'type' => PasswordType::class,
                    'first_options'  => array('label' => 'Mot de passe'),
                    'second_options' => array('label' => 'Confirmer le mot de passe'),
                ))
                ;
        }
    }
 
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => User::class,
        ));
    }
}

Le controlleur

<?php
// src/Controller/RegistrationController.php
namespace App\Controller;
 
use App\Form\UserType;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
 
class RegistrationController extends Controller
{
    /**
     * @Route("/inscription", name="user_registration")
     */
    public function registerAction(Request $request, UserPasswordEncoderInterface $passwordEncoder)
    {
        // création du formulaire
        $user = new User();
        // instancie le formulaire avec les contraintes par défaut, + la contrainte registration pour que la saisie du mot de passe soit obligatoire
        $form = $this->createForm(UserType::class, $user,[
           'validation_groups' => array('User', 'registration'),
        ]);        
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
 
            // Encode le mot de passe
            $password = $passwordEncoder->encodePassword($user, $user->getPlainPassword());
            $user->setPassword($password);
 
            // Enregistre le membre en base
            $em = $this->getDoctrine()->getManager();
            $em->persist($user);
            $em->flush();
 
            return $this->redirectToRoute('connexion');
        }
 
        return $this->render(
            'registration/register.html.twig',
            array('form' => $form->createView())
        );
    }
}

Le template

{# registration/register.html.twig #}
 
{{ form_start(form) }}
    {{ form_row(form.username) }}
    {{ form_row(form.email) }}
    {{ form_row(form.plainPassword.first) }}
    {{ form_row(form.plainPassword.second) }}
 
    <button type="submit">S'inscrire!</button>
{{ form_end(form) }}

Et voilà, l'inscription des membres est déjà implémentée. Merci la puissance de Symfony !

Je vous laisse tester tranquillement en vous rendant à l'url /inscription et en vérifiant qu'après avoir validé votre inscription, tout ça soit bien enregistré en base. Normalement, si vous avez bien suivi les parties précédentes, cela devrait fonctionner. Ceci dit, une erreur est possible. Donc si vous avez des questions, ou si vous avez repéré une erreur dans cet article, n'hésitez pas à m'envoyer un email (jeremy@geekco.fr).

Je vous conseille vivement d'aller voir le dépôt Github du projet si vous avez un problème pour implémenter tout ça. Vous trouverez le lien dans la rubrique ci-dessous.