Les fixtures utilisateurs
Comme après chaque création de table, on va vouloir disposer de données de tests pour pouvoir travailler immédiatement après l'installation du projet.
Nous allons donc ajouter 2 fixtures utilisateurs : un utilisateur normal et un utilisateur administrateur.
Le mot de passe
Pour hacher le mot de passe, nous allons avoir besoin d'un service.
Si on n'a aucune idée de la manière dont hacher un mot de passe, on peut chercher ce qui est disponible et autowiré pour pouvoir l'injecter directement dans le constructeur des fixtures :
php bin/console debug:autowiring Password
À première vue, les deux interfaces qui peuvent nous intéresser sont UserPasswordHasherInterface et UserPasswordEncoderInterface.
En effectuant quelques recherches, on découvre que l'interface UserPasswordHasherInterface a été introduite avec Symfony 5.3 dans le composant PasswordHasher pour disposer d'un composant nommé plus clairement et éviter les confusions qui étaient faites quelquefois concernant l'encodage plutôt que le hachage des mots de passe.
Nous allons donc injecter le service de hachage de mot de passe en utilisant l'interface du PasswordHasher :
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
class AppFixtures extends Fixture
{
public function __construct(private UserPasswordHasherInterface $hasher)
{
}
}
L'interface dispose d'une méthode hash, qu'on pourra utiliser sur l'instance fournie par le container de services. Nous pouvons alors créer nos deux utilisateurs et les persister en base de données :
public function load(ObjectManager $manager): void
{
$regularUser = new User();
$regularUser
->setEmail('bobby@bob.com')
->setPassword($this->hasher->hashPassword($regularUser, 'test'));
$manager->persist($regularUser);
$adminUser = new User();
$adminUser
->setEmail('admin@mycorp.com')
->setRoles(['ROLE_ADMIN'])
->setPassword($this->hasher->hashPassword($adminUser, 'test'));
$manager->persist($adminUser);
//...autres fixures...
$manager->flush();
}
Les mots de passe arrivent alors déjà hachés en base de données !