D
D
Dmitry2017-05-10 02:51:12
Yii
Dmitry, 2017-05-10 02:51:12

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();
    }

Moved most of the logic to the service.
How else can this method be refactored ?
Thank you.

Answer the question

In order to leave comments, you need to log in

1 answer(s)
M
Maxim Fedorov, 2017-05-10
@another_dream

How else can this method be refactored?

1. As far as I understand, your logic (well, or some part of it) is in the controller. This is not correct from an MVC point of view, the controller is not the place for logic.
2. Now you have a porridge from the code in the controller, which is very difficult to read and perceive. Therefore, I recommend reading, for example, https://refactoring.guru/ru to understand the main problems of the code and how to solve them

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question