Вызов функции-члена setPassword () в массиве - получение и обновление объекта doctrine - PullRequest
0 голосов
/ 16 июня 2020

Ну, должно быть, я делаю что-то синтаксически неправильно, объясню свою маленькую проблему.

У меня есть слушатель symfony, который получает электронную почту пользователя и должен обновлять информацию об этом пользователе.

Для этого я подумал, что получу пользователя с репозиторием, а затем обновлю его с помощью -set ... () Но нет ... У меня такая ошибка:

Вызов функция-член setPassword () в массиве

Я понимаю, что репо возвращает мне массив, но как тогда заставить его вернуть изменяемую сущность?

Вот мой слушатель:

<?php

namespace App\Events;

use ApiPlatform\Core\EventListener\EventPriorities;
use App\Entity\User;
use App\Repository\UserRepository;
use App\Entity\ForgotPassEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\ViewEvent;
use Symfony\Component\Templating\EngineInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Twig\Environment;

class ForgotPasswordSubscriber implements EventSubscriberInterface {


    public function __construct(\Swift_Mailer $mailer,Environment $environment,UserRepository $userRepository,EntityManagerInterface $em)
    {
        $this->mailer = $mailer;
        $this->twig = $environment;
        $this->userRepository = $userRepository;
        $this->em = $em;
    }

    public static function getSubscribedEvents()
    {
        return [
            KernelEvents::VIEW => ['SendMail', EventPriorities::POST_WRITE],
        ];
    }



    public function SendMail(ViewEvent $event): void
    {
        function generateRandomString($length = 10) {
            $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
            $charactersLength = strlen($characters);
            $randomString = '';
            for ($i = 0; $i < $length; $i++) {
                $randomString .= $characters[rand(0, $charactersLength - 1)];
            }
            return $randomString;
        }

        $forgotPassHandler = $event->getControllerResult();
        $method = $event->getRequest()->getMethod();

        if (!$forgotPassHandler instanceof ForgotPassEvent || Request::METHOD_POST !== $method) {
            return;
        }

        $user = $this->userRepository->findBy(array('email'=>$forgotPassHandler->getUserEmail()));

        if($user == null){
            return;
        }

        $generatePass = generateRandomString();

        dump($generatePass);

        $user->setPassword($generatePass);
        $this->em->flush();

        $message = (new \Swift_Message('Reset password OptaKPI'))
        ->setFrom('kpi@support.com')
        ->setTo($forgotPassHandler->getUserEmail())
        ->setBody(
            $this->twig->render(
                // templates/emails/registration.html.twig
                'emails/forgotPass.html.twig',
                [
                    'userEmail' => $forgotPassHandler->getUserEmail(),
                    'generatePass' => $generatePass
                ]
            ),
            'text/html'
        );
        try {
            $this->mailer->send($message);
        }
        catch (\Swift_TransportException $e) {
            dump($e->getMessage());
        }

    }
}

Должно быть, я чего-то упускаю ... Но, признаюсь, я не справляюсь с symfony очень хорошо ...

Спасибо вы!

PS: Извините за мой английский sh ^^ '

Ответы [ 3 ]

1 голос
/ 16 июня 2020

Вы вызываете метод findBy, который возвращает коллекцию пользователей, но вам нужно findOneBy, который вернет одного пользователя

0 голосов
/ 16 июня 2020

Поправьте меня, если я ошибаюсь, но здесь происходит то, что ваш setPassword ожидает строку. Но ваша функция generateRandomString (); вероятно, возвращает массив, а не строку.

Посмотрите на свой generateRandomString (); и убедитесь, что вы сохранили строку в переменной $ generatePass.

0 голосов
/ 16 июня 2020

Здравствуйте, я новичок и могу ошибаться, но я вижу, что это синтаксически неверно, поскольку репо неправильно подключено и, следовательно, не возвращается с измененными значениями.

Опять же, я могу ошибаться, но надеюсь, что это немного помогло

...