Bonjour,

voila, je rencontre un problème avec mon code.Je voudrais modifier un utilisateur sans changer le mot de passe de celui-ci, cependant lorsque je fais cela le formulaire est posté mais avec un mot de passe vide qui est crypté avec bcrypt. Je ne comprend pas du tous pourquoi ça fait cela.
Voici mon code

Ce que je fais

Décrivez ici votre code ou ce que vous cherchez à faire

public function edituser(Request $request, Utilisateur $utilisateur, UserPasswordEncoderInterface $passwordEncoder)
    {

        $form = $this->createForm(UtilisateurType::class, $utilisateur);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $utilisateur->setPassword($passwordEncoder->encodePassword($utilisateur, $utilisateur->getPassword()));
            $this->em->merge($utilisateur);
            $this->em->flush();
            $this->addFlash('success', 'Edition Utilisateur avec succés');

            return $this->redirectToRoute('admin.adminadmin.list');
        }

        return $this->render(
            'admin/edit.html.twig',
            [
            'form' => $form->createView(),
            ]
        );
    }

Ce que je veux

Moi ce aue je veux c'est changer le nom, prenom et autres une fois que j'ai poster mes donnée.

Ce que j'obtiens

Car quand je poste mes données cela fonctionne mais il change le mot de passe avec un mot de passe vide et crypté.
Merci d'avance

4 réponses


Si tu ne veut pas modifier le mot de passe tu doit tout simplement ne pas le redéfinir comme tu le fait.

 if ($form->isSubmitted() && $form->isValid()) {
            // A enlever
            $utilisateur->setPassword($passwordEncoder->encodePassword($utilisateur, $utilisateur->getPassword()));
            //...
        }

Tu devrais regarder la formation symfony de grafikart

merci pour ton retour, j'ai déjà fait ce que tu m'a dis là mais j'ai le meme resultas, car quand la method post est activé c'est comme si il vidé tous les champs qui n'ont pas été renseigné.
Ce que je fais en haut je croyais que c'été comme cela que on récupérer le mot de passe depuis la base de donnée car contrairement aux autres champs qui récupère leur valeur depuis la base de donnée sur le champ mot de passe y a quasiment rien.Meme pas le mot de passe crypté.
Bon j'ai resolu mon problème en créant des formulaires séparé pour la modification mot de passe et la modification d'information utilisateur.
Sinon j'ai déjà fini cette formation jusqu'à la fin :D

En tous cas merci d'avoir répondu TheTakylo c'est sympa :)

Ok pas de soucis,

sinon tu aurais pu verifier la présence d'une valeur dans les champs, et de ne modifier que les champs remplis (cela aurait éviter que le mot de passe se change si rien na été saisi par l'utilisateur).

Hello,
Perso, la méthode que j'utilise est d'avoir une propriété supplémentaire plainPassword dans l'entité User, non mappé à Doctrine (juste une propriété avec getter et setter) qui apparaîtra dans ton form (contrairement à password qui ne sera pas dans le form). Ensuite, si sa valeur est vide, tu n'encodes pas le password. Si elle est rensiegnée, alors tu definis la propriété password avec le plainPassword encodé avant le persist...
Je crois d'ailleurs que le bundle FosUser est codé comme cela.

if (!empty($utilisateur->getPlainPassword())) {
    $utilisateur->setPassword($passwordEncoder->encodePassword($utilisateur, $utilisateur->getPlainPassword()));
}

Si tu veux faire les choses comme il faut, tu définis des groups de validation dans ton entité, un pour la création, un autre pour la modif. Ainsi lors de la création tu peux rendre password et plainPassword obligatoires (via @Assert\NotBlank()) et facultatifs lors de la modification.