Использовать кодировщик в сервисе

Когда я пытаюсь использовать кодировщик в службе, я получаю следующую ошибку:

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.

Интерфейсы не могут быть созданы. Судя по названию, UserPasswordEncoderInterface - это интерфейс

bassxzero 10.08.2018 16:26
2
1
1 155
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы закодировать пароль в 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, как вы это делаете?

YeisonM 21.04.2020 21:35

Никто ничего не сказал об использовании сервисов использования внутри сущностей. Это абсолютный антипаттерн.

lxg 22.04.2020 10:43

Другие вопросы по теме