I would like to know how to pass UserInterface as a parameter to the encodePassword function. Actually, when running the following command line php bin/console doctrine:fixtures:load
, I got this message error:
Argument 1 passed to Symfony\Component\Security\Core\Encoder\UserPasswordEncoder::encodePassword() must be an instance of Symfony\Component\Security\Core\User\UserInterface, instance of App\Entity\User given,
These are my relevant files:
User.php :
<?phpnamespace App\Entity;use App\Repository\UserRepository;use Doctrine\ORM\Mapping as ORM;use Symfony\Component\Security\Core\User\UserInterface;use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;/** * @ORM\Entity(repositoryClass=UserRepository::class) * @UniqueEntity(fields="email", message="Un utilisateur existe déjà avec cet email.") */class User{ /** * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(type="string", length=255) */ private $nom; /** * @ORM\Column(type="string", length=255) */ private $prenom; /** * @ORM\Column(type="text") */ private $roles; /** * @ORM\Column(type="string", length=255) */ private $email; /** * @ORM\Column(type="string", length=255) */ private $password; public function getId(): ?int { return $this->id; } public function getNom(): ?string { return $this->nom; } public function setNom(string $nom): self { $this->nom = $nom; return $this; } public function getPrenom(): ?string { return $this->prenom; } public function setPrenom(string $prenom): self { $this->prenom = $prenom; return $this; } public function getRoles(): ?string { return $this->roles; } public function setRoles(string $roles): self { $this->roles = $roles; return $this; } public function getEmail(): ?string { return $this->email; } public function setEmail(string $email): self { $this->email = $email; return $this; } public function getPassword(): ?string { return $this->password; } public function setPassword(string $password): self { $this->password = $password; return $this; }// public function getRoles(){// return [// 'ROLE_ADMIN'// ];// } public function getSalt() {} public function eraseCredentials() {}// Some added code public function serialize(){ return $this->serialize([ $this->id, $this->email, $this->password ]); } public function unserialize($string){ list( $this->id, $this->email, $this->password ) = unserialize($string, ['allowed_classes' => false]); }}
UserFixture.php :
<?phpnamespace App\DataFixtures;use App\Entity\User;use Doctrine\Bundle\FixturesBundle\Fixture;use Doctrine\Persistence\ObjectManager;use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;use Symfony\Component\Security\Core\User\UserInterface;class UserFixture extends Fixture{ private $encoder; public function __construct(UserPasswordEncoderInterface $encoder) { $this->encoder = $encoder; } public function load(ObjectManager $manager): void { $user = new User(); $user->getNom('test'); $user->setPrenom('test'); $user->setRoles('["ROLE_ADMIN"]'); $user->setEmail('test@gmail.com'); $user->setPassword( $this->encoder->encodePassword($user,'test') ); $manager->persist($user); $manager->flush(); }}
UserInterface.php :
<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Security\Core\User; use Symfony\Component\Security\Core\Role\Role; /** * Represents the interface that all user classes must implement. * * This interface is useful because the authentication layer can deal with * the object through its lifecycle, using the object to get the encoded * password (for checking against a submitted password), assigning roles * and so on. * * Regardless of how your users are loaded or where they come from (a database, * configuration, web service, etc.), you will have a class that implements * this interface. Objects that implement this interface are created and * loaded by different objects that implement UserProviderInterface. * * @see UserProviderInterface * * @author Fabien Potencier <fabien@symfony.com> */ interface UserInterface { /** * Returns the roles granted to the user. * * public function getRoles() * { * return ['ROLE_USER']; * } * * Alternatively, the roles might be stored in a ``roles`` property, * and populated in any number of different ways when the user object * is created. * * @return array<Role|string> The user roles */ public function getRoles(); /** * Returns the password used to authenticate the user. * * This should be the encoded password. On authentication, a plain-text * password will be salted, encoded, and then compared to this value. * * @return string|null The encoded password if any */ public function getPassword(); /** * Returns the salt that was originally used to encode the password. * * This can return null if the password was not encoded using a salt. * * @return string|null The salt */ public function getSalt(); /** * Returns the username used to authenticate the user. * * @return string The username */ public function getUsername(); /** * Removes sensitive data from the user. * * This is important if, at any given point, sensitive information like * the plain-text password is stored on this object. */ public function eraseCredentials(); }
UserPasswordEncoderInterface.php :
<?php/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */namespace Symfony\Component\Security\Core\Encoder;use Symfony\Component\Security\Core\User\UserInterface;/** * UserPasswordEncoderInterface is the interface for the password encoder service. * * @author Ariel Ferrandini <arielferrandini@gmail.com> * * @method bool needsRehash(UserInterface $user) */interface UserPasswordEncoderInterface{ /** * Encodes the plain password. * * @param string $plainPassword The password to encode * * @return string The encoded password */ public function encodePassword(UserInterface $user, $plainPassword); /** * @param string $raw A raw password * * @return bool true if the password is valid, false otherwise */ public function isPasswordValid(UserInterface $user, $raw);}
So, what's wrong in my code and how can I fix it. Any idea?