UserPasswordEncoderInterface
- всего лишь сахар при использовании в простых кейсах.
К примеру у вас есть сущность
class User implements UserInterface
{
public function __construct(string $username, string $password)
{
$this->username = $username;
$this->password = $password;
}
}
В данном случае
$password
- это не plainPassword, а уже захешированный.
Как создать такую сущность, если
UserPasswordEncoderInterface
требует инстанс этого класса?
$user = new User($username, $this->encodePassword($plainPassword));
private EncoderFactoryInterface $encoderFactory;
private function encodePassword(string $plainPassword): string
{
$encoder = $this->encoderFactory->getEncoder(User::class);
return $encoder->encodePassword($plainPassword, null);
}
Eсли уж быть точнее, то ответ на вопрос "Какой смысл в PasswordEncoderInterface если есть UserPasswordEncoderInterface?" - нельзя, не нарушая SRP, реализовать
UserPasswordEncoderInterface
, не имея при этом
PasswordEncoderInterface
и
EncoderFactoryInterface
, т.е. это интерфейс более высокого уровня, чем
PasswordEncoderInterface
P.S. Соль хранить не надо. В данном случае это рудимент, который остался от первых версий, когда не использовался password_hash, который добавляет метаданные рядом с хешем. Достаточно создать метод-заглушку:
public function getSalt()
{
return null;
}