Описана процедура подтверждения email посредством токена:
i.imgur.com/jkh6cgv.pngpublic 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();
}
Вынес большую часть логики в сервис.
Как еще можно
отрефакторить данный метод?
Спасибо.