encodage des mot de passe symphony

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

Bonjour, j’essaie d’encoder les mots de passe comme la documentation l’indique : https://symfony.com/blog/new-in-symfony-5–3-passwordhasher-component.

je vous envoies mon code ci-dessous :

<?php

namespace App\Controller;

use App\Form\RegisterType;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
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\PasswordHasherInterface;

class RegisterController extends AbstractController
{
    /**
     * @Route("/inscription", name="register")
     */
    public function index(Request $request,EntityManagerInterface $doctrine,PasswordHasherInterface $encoder) : response
    {
        $user = new User();
        $form = $this->createForm(RegisterType::class,$user);
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()){
            $user=$form->getData();

            $doctrine->persist($user);
            $doctrine->flush();
            dd($user);
        }

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

et mon message d’erreur :

Cannot autowire argument $encodage of "App\Controller\RegisterController::index()": it references interface "Symfony\Component\PasswordHasher\PasswordHasherInterface" but no such service exists. Did you create a class that implements this interface?

Merci pour votre aide

Modification par @Amaury : mise en forme Markdown (n’hésite pas à modifier ton message pour voir comment j’ai fait).

+0 -0

Salut

Essaie Hasher\UserPasswordHasherInterface plutôt que PasswordHasherInterface (espace de noms avec un élément supplémentaire) ?

S’il te plaît, si ça fonctionne, prends quand même le temps de mettre en forme le code de ton message ci-dessus, merci d’avance.  :)

Edit

Merci @Amaury

+2 -0
namespace App\Controller;

use App\Form\RegisterType;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
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\PasswordHasherInterface;

class RegisterController extends AbstractController
{
    /**
     * @Route("/inscription", name="register")
     */
    public function index(Request $request,EntityManagerInterface $doctrine,UserPasswordHasherInterface $encodage) : response
    {
        $user = new User();
        $form = $this->createForm(RegisterType::class,$user);
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()){
            $user=$form->getData();

            $passworld =$encodage->encodePassworld($user, $user->getPassworld());
            $user->setPasswrold($passworld);

            $doctrine->persist($user);
            $doctrine->flush();
            dd($user);
        }

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

Je vous renvoies mon code j’espère que c’est mieux. j’ai essayé de mettre en paramètre de la fonction index: UserPasswordHasherInterface,PasswordHasherInterface et Hasher\UserPasswordHasherInterface mais rien ne marche.

Mmm, avec l’exemple que tu nous donnes, tu utilises UserPasswordHasherInterface, mais tu ne l’importes pas avec le use nécessaire, c’est voulu ? Quand bien même c’était un mélange, il y a une erreur de syntaxe au niveau de encodePassworld, une lettre de trop (et même bien orthographiée, cette méthode n’existe pas pour le nouvel interface, il faut remplacer la partie encode par hash), pareil pour getPassworld(), et que dire de setPasswrold()

Mis à part ça, est-ce qu’on peut te demander d’en dire un peu plus que simplement « rien ne marche » ?

Si jamais, tu pourrais t’aider de la commande make:registration-form peut-être.

+0 -0

Je peux t’en dire plus, je suis totalement débutant sur symfony et je suis une formation sur Udemy. Le problème c’est que cette formation date d’il y a 2 ans environ et qu’entre temps symfony à fait quelque mises à jour. Or, le formateur utilisait comme dépendance UserPassworldEncoderInterface à la place de mon UserPasswordHasherInterface puis dans le "index" il ajoute ces deux ligne de codes:

 $passworld =$encodage->encodePassworld($user, $user->getPassworld());
 $user->setPasswrold($passworld);

Moi j’aimerais juste savoir comment je fais pour encoder aujourdh’ui avec symfony.

De plus, tu me dis que je n’importe pas avec USE mais en dernière ligne j’ai :

use Symfony\Component\PasswordHasher\PasswordHasherInterface;

En fait j’aimerais savoir sur le code ci-dessous :

namespace App\Controller;

use App\Form\RegisterType;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
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\PasswordHasherInterface;

class RegisterController extends AbstractController
{
    /**
     * @Route("/inscription", name="register")
     */
    public function index(Request $request,EntityManagerInterface $doctrine,UserPasswordHasherInterface $encodage) : response
    {
        $user = new User();
        $form = $this->createForm(RegisterType::class,$user);
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()){
            $user=$form->getData();

            $passworld =$encodage->encodePassworld($user, $user->getPassworld());
            $user->setPasswrold($passworld);

            $doctrine->persist($user);
            $doctrine->flush();
            dd($user);
        }

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

quel composant importer à la place de : "use useSymfony\Component\PasswordHasher \PasswordHasherInterface;"

que mettre dans le paramètre de function index à la place de UserPasswordHasherInterface

et du coup pour les méthodes tu m’as donné la solution qui est : hasherpassworld à la place de encodepassworld.

Dans la liste de use …, remplace juste (dans le sens uniquement, pas toute la ligne) PasswordHasherInterface par Hasher\UserPasswordHasherInterface.

Dans la signature de la méthode, remplace PasswordHasherInterface par UserPasswordHasherInterface.

Pour ce qui est des méthodes, oublie ce l que tu as mis dedans et qui va te poser problème.

Edit

Correction d’un mauvais copié-collé, c’est bien UserPasswordHasherInterface qu’il faut mettre à la place de PasswordHasherInterface dans la signature de la méthode.

+0 -0
namespace App\Controller;

use App\Form\RegisterType;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Controller\UserPasswordHasherInterface;

class RegisterController extends AbstractController
{
    /**
     * @Route("/inscription", name="register")
     */
    public function index(Request $request,EntityManagerInterface $doctrine,UserPasswordHasherInterface $encodage) : response
    {
        $user = new User();
        $form = $this->createForm(RegisterType::class,$user);
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid()){
            $user=$form->getData();
            
            $passworld =$encodage->hasherpassworld($user, $user->getPassworld());
            $user->setPasswrold($passworld);

            $doctrine->persist($user);
            $doctrine->flush();
            dd($user);
        }

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


l'éditeur de code me souligne en rouge UserPasswordHasherInterface en disant undefined type intelephense (1009).

Oui, parce que j’avais cru être assez précis sur ce qu’il fallait remplacer et par quoi, mais tu as remplacé plus et par autre chose…

La première ligne de mon message précédent voulait dire que pour use Symfony\Component\PasswordHasher\PasswordHasherInterface;, il fallait remplacer ce qui est en gras par Hasher\UserPasswordHasherInterface.
Tu as remplacé Symfony\Component\PasswordHasher\PasswordHasherInterface par App\Controller\UserPasswordHasherInterface…

Et tu ne sembles pas avoir corrigé le problème avec passworld. Ce n’est pas un "monde passe", mais un "mot de passe"  :D

+1 -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