调用数组上的成员函数setPassword()--获取&更新实体学说。

问题描述 投票:0回答:1

好吧,我一定是做了什么语法上的错误,我来解释一下我的小问题。

我有一个symfony监听器,可以获取用户的电子邮件,并且必须更新这个用户的信息。

为此,我想我应该用仓库获取用户,然后用-set...()更新,但没有.... 我犯了这个错误。

在数组上调用成员函数setPassword()

我知道repo会返回一个数组给我,但是如何让它返回可修改的实体呢?

这是我的监听器。

<?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('[email protected]')
        ->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 : 对不起,我的英语不好 ^^'

symfony doctrine
1个回答
1
投票

你调用 findBy 方法,返回一个用户集合,但你需要用 findOneBy 将返回一个用户


0
投票

你好,所以我是新来的,我可能错了,但我可以看到它是语法上的错误,因为repo没有正确连接,因此没有返回与修改的值。

同样,我也许错了,但希望这对你有帮助。


0
投票

如果我错了,请纠正我,但那里发生的事情,是你的setPassword期望一个字符串.但你的函数generateRandomString();可能是返回一个数组,而不是一个字符串.看看你的generateRandomString();并确保你在你的$generatePass变量中存储一个字符串。

看一下你的 generateRandomString(); 并确保你在$generatePass 变量中存储了一个字符串。

© www.soinside.com 2019 - 2024. All rights reserved.