Как закодировать пароль для произвольной сущности в Symfony? - PullRequest
1 голос
/ 06 ноября 2019

Я создаю таблицу организаций в mysql.

Сущность называется Organisation, и у нее есть поле password.

Когда я пытаюсь использовать UserPasswordEncoderInterface, она ожидаетuser сущность, так что это не работает. Я пытался использовать PasswordEncoderInterface, но он говорит, что сервис не существует. Что здесь можно сделать?

Это мой код:

   public function register(Request $request, EntityManagerInterface $entityManager, PasswordEncoderInterface $encoder)
    {
        $organisation = new Organisation();

        $form = $this->createForm(OrganisationRegisterType::class, $organisation);

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $plainPassword = $form->getData()->getPassword();
            $encoded = $encoder->encodePassword($plainPassword, null);
            $organisation->setPassword($encoded);

            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($organisation);
            $entityManager->flush();

            $this->addFlash(
                'success',
                'Organizacija sukurta sėkmingai. Nurodytu el. paštu buvo išsiųsta prisijungimo informacija'
            );
        }

Это ошибка, которую я получаю:

Невозможно автопроводить аргумент $ encoder для "App \ Controller \ OrganisationController ::register () ": он ссылается на интерфейс" Symfony \ Component \ Security \ Core \ Encoder \ PasswordEncoderInterface ", но такой службы не существует. Вы создали класс, который реализует этот интерфейс? `

Ответы [ 2 ]

4 голосов
/ 06 ноября 2019

PasswordEncoderInterface не существует.

Самое простое решение - заставить ваш класс Organisation реализовать UserInterface.

UserPasswordEncoder не ожидает User объект, но объект, который реализует этот интерфейс. Даже если ваш организационный класс сам по себе не является «пользовательским», похоже, вы хотите, чтобы у него был такой же интерфейс (имя пользователя, пароль ...).

Просто измените свой организационный класс для реализации этого интерфейсаи введите UserPasswordEncoderInterface как обычно.

0 голосов
/ 07 ноября 2019

Если предложение @yivi не применимо для вашего класса сущностей, вы можете вручную внедрить соответствующую реализацию кодера в свой контроллер. Либо получите доступ к контейнеру в контроллере, либо, что еще лучше, настройте свои контроллеры как службы и добавьте службу через инъекцию сеттера .

...