Когда я пытаюсь использовать кодировщик в службе, я получаю следующую ошибку:
Cannot instantiate interface Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface.
Вот мой код:
namespace App\Service;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
class Test
{
public function encodePassword($username, $password)
{
$passwordEncoder = new UserPasswordEncoderInterface();
$encodedPassword = $passwordEncoder->encodePassword($admin, $password);
return $encodedPassword;
}
}
Я использую Symfony 4.






Чтобы закодировать пароль в Symfony, используйте фабрику кодировщиков. Вы можете внедрить его в свой собственный сервис, внедрив экземпляр EncoderFactoryInterface в свой конструктор (если у вас включено автоматическое подключение, Symfony обработает это автоматически), а затем использовать его следующим образом:
use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface;
use Symfony\Component\Security\Core\User\UserInterface;
class SomeService
{
/**
* @var EncoderFactoryInterface
*/
private $securityEncoderFactory;
public function __construct(EncoderFactoryInterface $securityEncoderFactory)
{
$this->securityEncoderFactory = $securityEncoderFactory;
}
public function encodePassword(UserInterface $user, $password)
{
$encoder = $this->securityEncoderFactory->getEncoder($user);
return $encoder->encodePassword($password, $user->getSalt());
}
}
Обратите внимание, что мы ожидаем, что у сущности User будет соль. Если вы еще не создали соль, сделайте это перед кодированием пароля.
Простой подход к обновлению пользователя с помощью соли и пароля может выглядеть так:
public function setPassword(UserInterface $user, string $password)
{
$user->setSalt(base64_encode(random_bytes(18)));
$this->setPassword($user, $this->encodePassword($password));
}
Не забудьте после этого сохранить сущность.
Простите меня, я учусь, как я могу вызвать службу внутри Entity, как вы это делаете?
Никто ничего не сказал об использовании сервисов использования внутри сущностей. Это абсолютный антипаттерн.
Интерфейсы не могут быть созданы. Судя по названию, UserPasswordEncoderInterface - это интерфейс