我正在寻找一种精益方式来比较两次。一个是时间,有人要求新密码(FOS UserBundle提供了一个Getter),另一个是当前时间减去例如10分钟。
if($user->getPasswordRequestedAt() <= date("Y-m-d H:i:s", strtotime('-10 minutes'))){
return $this->render('@User/Resetting/no_resend.html.twig', array( 'username' => $username));
}
else {
return $this->render('@User/Resetting/check_email.html.twig', array(
'tokenLifetime' => ceil($this->container->getParameter('fos_user.resetting.retry_ttl') / 60),
));
因此,如果有人在10分钟前已经请求了密码,他会进入页面说“#34;您已经请求了密码,请等待10分钟重试。”#34;。如果请求超过10分钟,则页面显示&#34;已发送电子邮件以进行密码重置&#34;。
我认为这种比较是正确的,但它总是以某种方式进入&#34;否则&#34;一部分。
哪里出错?
答案 0 :(得分:0)
if($user->getPasswordRequestedAt() >= date("Y-m-d H:i:s", strtotime('-10 minutes'))){
应该做的伎俩。
由于您要检查上一次请求是在过去10分钟内完成还是更新
答案 1 :(得分:0)
据我所知$user->getPasswordRequestedAt()
(因为通过Doctrine处理)是\DateTime
的实例。
所以使用另一个日期时间进行比较:
$limit = \new DateTime();
$limit->sub(new \DateInterval("P600S"));
if($user->getPasswordRequestedAt() >= $limit){
return $this->render('@User/Resetting/no_resend.html.twig', array( 'username' => $username));
}
else {
return $this->render('@User/Resetting/check_email.html.twig', array(
'tokenLifetime' => ceil($this->container->getParameter('fos_user.resetting.retry_ttl') / 60),
));
使用此方法,您可以保留OOP样式并使用干净的if子句。 $limit
保存10分钟前的时间戳。因此,当您在14:10请求密码并且现在是14:19时,$limit
将保持14:09。只要请求的密码日期大于10分钟前的时间戳,就不会重新发送。
编辑:由于您正在使用FOS UserBundle,因此iainn指出它确实可以缩短它:
if($user->isPasswordRequestNonExpired(600)){
return $this->render('@User/Resetting/no_resend.html.twig', array( 'username' => $username));
}
else {
return $this->render('@User/Resetting/check_email.html.twig', array(
'tokenLifetime' => ceil($this->container->getParameter('fos_user.resetting.retry_ttl') / 60),
));
此方法的第一个也是唯一的参数是必须经过的秒数,以便可以再次请求密码。
答案 2 :(得分:0)
由于我没有使用过symfony,我无法确切知道 但这是我的猜测。看看它是否有效。
$dt = $user->getPasswordRequestedAt();
If($dt->getTimestamp() <= strtotime(time())-600){
return $this->render('@User/Resetting/no_resend.html.twig', array( 'username' => $username));
}else {
return $this->render('@User/Resetting/check_email.html.twig', array(
'tokenLifetime' => ceil($this->container->getParameter('fos_user.resetting.retry_ttl') / 60),
));
这会将datetime对象创建为$ dt变量 在if()中,我使用get_timestamp来获取datetime对象的Unix值,并将其与Unix时间-600秒(10分钟)进行比较。
我选择Unix值的原因是因为它们非常适合比较。