another_dream
@another_dream
Backend-разработчик, Laravel/ZF2/Yii2

Как оптимизировать экшен подтверждения аккаунта по токену?

Описана процедура подтверждения email посредством токена:
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();
    }


Вынес большую часть логики в сервис.
Как еще можно отрефакторить данный метод?

Спасибо.
  • Вопрос задан
  • 483 просмотра
Решения вопроса 1
qonand
@qonand
Software Engineer
Как еще можно отрефакторить данный метод?

1. Насколько понимаю у Вас логика (ну либо какая-то ее часть) находиться в контроллере. Это не правильно с точки зрения MVC, контроллер не место для логики.
2. Сейчас у Вас в контроллере каша из кода, которая очень трудно читается и воспринимается. Поэтому рекомендую почитать например https://refactoring.guru/ru для понимая основных проблем кода и способов их решения
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы