-2

我正在寻找一种比较精益的方法来比较两次。一个是时间,有人要求一个新密码(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 分钟前已经请求密码,他会进入“您已经请求密码,请等待 10 分钟重试”的页面。如果请求的时间超过 10 分钟,页面会显示“密码重置电子邮件已发送”。

我认为这种比较是正确的,但它总是以某种方式进入“其他”部分。

哪里错了?

4

3 回答 3

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 子句。保存 10 分钟前的$limit时间戳。因此,当您在 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),
));

此方法的第一个也是唯一的参数是必须经过的秒数,以便可以再次请求密码。

于 2018-01-09T15:41:01.530 回答
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),
));

这将为 $dt 变量创建日期时间对象。
在 if() 中,我使用 get_timestamp 获取 datetime 对象的 Unix 值并将其与 Unix 时间 -600 秒(10 分钟)进行比较。

我选择 Unix 值的原因是因为它们非常适合比较。

于 2018-01-09T16:29:54.840 回答
0
if($user->getPasswordRequestedAt() >= date("Y-m-d H:i:s", strtotime('-10 minutes'))){

应该做的伎俩。

由于您想检查最后一个请求是否在过去 10 分钟或更晚的时间内完成

于 2018-01-09T15:25:53.867 回答