Answer the question
In order to leave comments, you need to log in
How to optimize the token account confirmation action?
The procedure for confirming email using a token is described:
i.imgur.com/jkh6cgv.png
public function actionEmailConfirm($token)
{
if (empty($token) || !is_string($token)) {
throw new InvalidParamException('Неверная ссылка для подтверждения');
}
$user = $this->userService->findByEmailConfirmToken($token);
if ($user) {
// Проверка токена на актуальность
if ($this->userService->isValidEmailConfirmToken($user->email_confirm_token)) {
// Проверка активен ли юзер
if (!$this->userService->isActiveUser($user)) {
// Подтверждаем юзера по email
if ($this->userService->confirmEmail($user)) {
Yii::$app->getSession()->setFlash(
'success',
'Ваш email успешно подтвержден. Вы можете войти в систему используя данные, указанные при регистрации'
);
}
} else {
Yii::$app->getSession()->setFlash('info', 'Ваш email уже был подтвержден ранее');
}
} else {
// Токен просрочен, поэтому генерируем новый
$newEmailConfirmToken = $this->userService->generateEmailConfirmToken();
// Обновляем токен у юзера
$user = $this->userService->updateOneById($user->id, ['email_confirm_token' => $newEmailConfirmToken]);
if ($user) {
// Отправляем письмо юзеру
$this->userService->sendEmailConfirmMail($user);
Yii::$app->getSession()->setFlash(
'warning',
'Ссылка для подтверждения уже просрочена. Мы отправили Вам новую ссылку для подтверждения'
);
}
}
} else {
Yii::$app->getSession()->setFlash('error', 'Некорректная ссылка для подтверждения');
}
return $this->goHome();
}
Answer the question
In order to leave comments, you need to log in
How else can this method be refactored?
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question