我正在尝试在我的数据库中更新一行。
在本例中,我使用了两个实体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(),
));
}
正如您在转储($user)部分中看到的;我通过请求获得了以下数据:
正如我在同一部分中所理解的,近转储($user)。我想用$ token ->setToken($pledge)方法从我的用户更新新的令牌
为了管理这一点,哪种方法是正确的?
耽误您时间,实在对不起。
发布于 2019-04-11 01:21:49
我使用了以下代码:
...............
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();
................
如我所料,这是正确的方法吗?
发布于 2019-04-11 03:48:19
我建议做一些修改:
Token
,而是每次生成一个全新的实体。请记住,如果对Token
执行presentToken
,而不是$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()
部件,并且error on email
字段会自动附加到该部件,因此不需要(除非您需要)的闪烁消息
从更广泛的角度来看,我还会将Token
实体更改为关系的$user
属性(而不是$username
),以及Token
的值的$value
属性(而不是$token
)。我也会在Profile
实体(以及可能与<代码>D40相关的其他实体中)中将$username
重命名为$user
。
https://stackoverflow.com/questions/55617372
复制相似问题