problème avec la méthode setPassword pour les formulaires

Le problème exposé dans ce sujet a été résolu.

Bonjour, j’essaie de faire en sorte que l’utilisateur puisse changer son password mais lorsque je tape a la fin de mon code "user>setPassword(user->setPassword(password);" il me met un message d’erreur "undefined method setPassword", comme s’il n’avait pas accès aux méthodes de ma classes User. Je vous envoie mon code ci_dessous:

<?php

namespace App\Controller;

use App\Form\ChangePasswordType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Doctrine\ORM\EntityManagerInterface;


class AccountPasswordController extends AbstractController
{

    /**
     * @Route("/compte/modifier-mdp", name="account_password")
     */
    

    public function index(Request $request,UserPasswordHasherInterface $encodage,EntityManagerInterface $doctrine): Response
    {
        $user = $this->getUser();
        $form = $this->createForm(ChangePasswordType::class, $user);
        
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()){
            $old_pwd = $form->get('old_password')->getData();

            if($encodage->isPasswordValid($user,$old_pwd)){
                $new_pwd= $form->get('new_password')->getData();
                $password = $encodage->hashPassword($user, $new_pwd);
                
                $user->setPassword($password);
                $doctrine->persist($user);
                $doctrine->flush();
            }
        }

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

Salut

Vérifie bien que tu n’as pas de "monde passe" aussi dans ton entité User (donc à tout hasard setPassworld…) ?

Il ne faut plus utiliser getUser(), mais mettre un paramètre typé \Symfony\Component\Security\Core\User\UserInterface dans la signature de l’action. Par contre, si l’utilisateur peut accéder à cette route sans être authentifié, forcément, tu ne pourras pas le récupérer de ta manière ni de la mienne.

@viki53 : les propriétés sont par défaut privées avec Symfony, il ne peut pas en définir la valeur ainsi depuis un autre objet.

+0 -0

-l’utilisateur doit être connecté pour pouvoir accéder à cette route. -Pour ce qui est de setPasword() de la classe USER je t’envoie le code :

public function setPassword(string $password): self
    {
        $this->password = $password;

        return $this;
    }

et je t’envoies le code que j’ai modifié dans mon controller :

<?php

namespace App\Controller;

use App\Form\ChangePasswordType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\User\UserInterface ;

class AccountPasswordController extends AbstractController
{

    /**
     * @Route("/compte/modifier-mdp", name="account_password")
     */
    

    public function index(Request $request,UserPasswordHasherInterface $encodage,EntityManagerInterface $doctrine,UserInterface $user): Response
    {
        $user = $this->getUser();
        $form = $this->createForm(ChangePasswordType::class, $user);
        
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()){
            $old_pwd = $form->get('old_password')->getData();

            if($encodage->isPasswordValid($user,$old_pwd)){
                $new_pwd= $form->get('new_password')->getData();
                $password = $encodage->hashPassword($user, $new_pwd);

                $user->setPassword($password);
                $doctrine->persist($user);
                $doctrine->flush();
            }
        }

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

j’ai bien rajouté le use Symfony\Component\Security\Core\User\UserInterface ; Par contre que dois-je mettre dans le paramètre de function index à la place de mon "UserInterface $user"?

Rien, et tu peux enlever la ligne 24. Le problème se pose-t’il toujours ?

Auquel cas je serais très curieux de savoir quel est le type exact de l’utilisateur récupéré, en fait. Tu peux mettre un dump(get_debug_type($user)); ligne 24 ? Si tu es sous PHP < 8, il faudra dump(gettype($user) === 'object' ? get_class($user) : gettype($user));, get_debug_type() ayant été introduit avec PHP 8.0.

+0 -0

Je ne comprends pas trop ce qu’il se passe, en fait le code marche très bien si comme tu l’as noté on enlève la ligne 24. J’ai donc testé de changer le mot de passe et çà fonctionne mais, j’ai quand meme une grosse erreur au niveau de user>setPassword(user->setPassword(password); qui est souligné en rouge dont le message d’érreur est undefined method. Or, si j’enlève cette ligne celà ne marche plus.

Je pense que ton éditeur de code se trompe un peu, du moment que ton code fonctionne, s’il te signale des erreurs qui n’en sont pas, c’est que c’en n’est pas.  :)

D’ailleurs, quel éditeur de code utilises-tu ?

Edit

N’oublie pas de signaler que tes sujets sont résolus, s’il te plaît. C’est vraiment plus pratique pour ceux qui font des recherches.

Et tu peux aussi utiliser les actions « Ce message m’a été utile » pour mieux mettre en avant la solution — tu peux même le faire sur tes propres messages.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte