传递给App \ Entity \ User :: setToken()的参数1必须是App \ Entity \ Token的实例或null,给定的字符串,调用

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

我正在尝试更新数据库中的一行。

在这种情况下,我使用两个实体User和Token

这是我的控制器中的方法:

/**
 * @Route("/forget-password/", name="forget", methods="GET|POST")
 */
 public function emailrestore(Request $request, UserRepository $userrepository, TokenGenerator $tokengenerator, MailGenerator $mailgenerator)
 {
    $userInfo = ['email' => null];
    $form = $this->createForm(ForgetPasswordType::class, $userInfo);
    $form->handleRequest($request);
    if ($form->isSubmitted() && $form->isValid()) {
        $userInfo = $form->getData();
        $email = $userInfo['email'];
        $user = $userrepository->findOneBy(['email' => $email]);
        if ($user === null){
            $message = "This email doesn't exist in our database or is wrong.";
            $this->session->getFlashBag()->add("danger", $message);
            return $this->redirectToRoute('forget');
        }
        // 2.5) Generating token
        $pledge = $tokengenerator->generateToken();
        $url = $this->generateUrl('recovery/', 
        array(
            'token' => $pledge
        ),
        UrlGeneratorInterface::ABSOLUTE_URL
        );
        $user->setToken($pledge);
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($token);
        $entityManager->flush();
        // 6) Sending the email to the user
        //$mailgenerator->registration($email, $url);
    }         
    return $this->render('emails/forget-password/forget-password.html.twig', array (
        'form' => $form->createView(),
    ));
 }

正如你在dump($ user)部分所看到的那样;我通过我的请求获得以下数据:

enter image description here

据我所知,在同一部分,靠近转储($ user)。我想用我的用户更新新的令牌,方法是$ token-> setToken($ pledge)

哪个是正确的方法来管理这个?

谢谢你的时间。

php symfony doctrine
2个回答
0
投票

我使用了以下内容:

...............
UrlGeneratorInterface::ABSOLUTE_URL
        );
        $token = $user->getToken();
        $creation = new \DateTime("now");
        $valid = (new \DateTime("now"))->modify('+1 day');
        $token->setToken($pledge);
        $token->setCreation($creation);
        $token->setValid($valid);
        $token->setActive(true);
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($token);
        $entityManager->flush();
................

它按照我的预期工作,这是正确的方法吗?


0
投票

我会建议一些改变:

  • 而不是编辑现有的Token,每次都生成一个全新的实体。请记住将orphan removal设置为删除旧的Token(如果存在)
  • 坚持$user,而不是$token。记住owning side
  • Token实体本身没有必要保留$active字段,因为实体本身似乎在$valid下有一个到期日。我会将该名称更改为$validUntil左右(因此它表示日期/时间)并使用它来检查Token是否确实仍然有效。您可以像这样修改Token实体:
private $validUntil;

public function isActive()
{
    return $this->validUntil > (new DateTime('now'));
}
  • 而不是验证if ($form->isSubmitted() && $form->isValid())内的电子邮件,我会添加一个custom validation constraint,将检查是否存在给定电子邮件的User。这样,如果没有User,你永远不会通过$form->isValid()部分,并且email字段上的错误会自动附加到它上面,所以不需要flash消息(除非你想要它)

在更广泛的图片中,我还将改变Token实体以获得关系的$user属性(而不是$username),以及$value值(而不是Token)的$token属性。我也会在$username实体中将$user重命名为Profile(并且可能在与User有关的其他实体中)。

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