Я ищу бережливый способ сравнить два раза. Одним из них является время, когда кто-то запросил новый пароль (для этого 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 минут назад, на страницах написано «Письмо для сброса пароля отправлено».
Я бы подумал, что сравнение правильно, но как-то всегда идет в «другое».
Где ошибка?
if($user->getPasswordRequestedAt() >= date("Y-m-d H:i:s", strtotime('-10 minutes'))){
Должен сделать свое дело.
Поскольку вы хотите проверить, был ли последний запрос выполнен за последние 10 минут или новее
Насколько я знаю $user->getPasswordRequestedAt()
(так как обрабатывается с помощью Доктрины) является примером \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),
));
При этом вы сохраняете стиль ООП и получаете чистое предложение 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),
));
Первый и единственный аргумент этого метода — это количество секунд, которое должно пройти, чтобы пароль можно было запросить снова.
Так как я не использовал 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, чтобы получить значение Unix объекта datetime и сравнить его со временем Unix -600 секунд (10 минут).
Причина, по которой я выбираю значения Unix, заключается в том, что они отлично подходят для сравнения.