我正在尝试更新数据库中的一行。
在这种情况下,我使用两个实体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)部分所看到的那样;我通过我的请求获得以下数据:
据我所知,在同一部分,靠近转储($ user)。我想用我的用户更新新的令牌,方法是$ token-> setToken($ pledge)
哪个是正确的方法来管理这个?
谢谢你的时间。
我使用了以下内容:
...............
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();
................
它按照我的预期工作,这是正确的方法吗?
我会建议一些改变:
Token
,每次都生成一个全新的实体。请记住将orphan removal设置为删除旧的Token
(如果存在)$user
,而不是$token
。记住owning sideToken
实体本身没有必要保留$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
有关的其他实体中)。