Maison > Questions et réponses > le corps du texte
J'essaie de câbler automatiquement l'interface PasswordHasher dans la classe Luminaires :
<?php namespace AppDataFixtures; use AppModelUserEntityUserEmail; use AppModelUserEntityUserId; use AppModelUserEntityUserRole; use AppModelUserEntityUserUser; use DoctrineBundleFixturesBundleFixture; use DoctrinePersistenceObjectManager; use SymfonyComponentPasswordHasherPasswordHasherInterface; class UserFixture extends Fixture { private PasswordHasherInterface $hasher; public function __construct(PasswordHasherInterface $hasher) { $this->hasher = $hasher; } public function load(ObjectManager $manager): void { $hash = $this->hasher->hash("password"); $user = User::signUpByEmail( Id::next(), new DateTimeImmutable(), new Email("admin@app.test"), $hash, "token" ); $user->confirmSignUp(); $user->changeRole(Role::admin()); $manager->persist($user); $manager->flush(); } }
Mais j'ai eu l'erreur :
Dans DefinitionErrorExceptionPass.php ligne 54 : ! !
!!Impossible de câbler automatiquement le service 'AppDataFixturesUserFixture' : paramètre '$hasher'
!!La méthode "__construct()" fait référence à l'interface "SymfonyComponentPasswordH
!!asherPasswordHasherInterface" mais aucun service de ce type n'existe. En avez-vous créé un
!!Une classe qui implémente cette interface ?
! !
Mon fichier services.yaml :
parameters: services: # default configuration for services in *this* file _defaults: autowire: true # Automatically injects dependencies in your services. autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. # makes classes in src/ available to be used as services # this creates a service per class whose id is the fully-qualified class name App: resource: '../src/' exclude: - '../src/DependencyInjection/' - '../src/Model/User/Entity/' - '../src/Kernel.php'
Comment hacher des mots de passe simples dans Symfony 6.1 ? Pourquoi est-ce que j'obtiens cette erreur ?
P粉7878203962023-12-14 09:25:15
Il n’y a pas de solution universelle PasswordHasher
.
Vous :
SymfonyComponentPasswordHasherHasherPasswordHasherFactoryInterface
SymfonyComponentPasswordHasherHasherUserPasswordHasherInterface
pour l'utilisateur*. En utilisant une usine, votre code ressemblera à ceci : (non testé)
//... use Symfony\Component\PasswordHasher\Hasher\PasswordHasherFactoryInterface; class UserFixture extends Fixture { private PasswordHasherFactoryInterface $passwordHasherFactory; public function __construct(PasswordHasherFactoryInterface $hasherFactory) { $this->passwordHasherFactory = $passwordHasherFactory; } public function load(ObjectManager $manager): void { $passwordHasher = $this->passwordHasherFactory->getPasswordHasher(User::class); $hash = $passwordHasher->hash("password"); $user = User::signUpByEmail( Id::next(), new \DateTimeImmutable(), new Email("admin@app.test"), $hash, "token" ); $user->confirmSignUp(); $user->changeRole(Role::admin()); $manager->persist($user); $manager->flush(); }
Pour réitérer, les étapes sont :
composer require symfony/password-hasher
UserPasswordHasherInterface
ou PasswordHasherFactoryInterface
(voir exemple PasswordHasherFactoryInterface
(请参阅示例)并获取PasswordHasher
) et obtenez
UserPasswordHasherInterface
* : Un exemple du correctif se trouve ici