Как закодировать пароль для произвольной сущности в Symfony?

Я создаю таблицу организаций в 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", но такой службы не существует. Вы создали класс, реализующий этот интерфейс? `


person zlotte    schedule 06.11.2019    source источник


Ответы (2)


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

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

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

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

person yivi    schedule 06.11.2019

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

person andaris    schedule 07.11.2019