Исключения или проверка?

Привет гуру, нужна твоя помощь! Изучая принцип "ТТУК - Толстые тупые уродливые контроллеры" решил сделать все контроллеры с помощью сервисов. Тут возникла проблема.

Пример: предположим процесс входа в систему в теории должен выглядеть так
в контроллере
$auth_service = new AuthService();

        try {
            $auth_service->auth($email, $password);
        } catch (ServiceException $e) {
            switch ($e->getCode()) {
                case ServiceException::NOT_FOUND_EMAIL:
                    return;
                case ServiceException::NOT_CORRECT_PASSWORD:
                    return;
                default:
                    throw $e;
            }
        }

в сервисе
public function auth(string $email, string $password)
    {
        if ($this->isEmailNotExists($email)) {
            throw new ServiceException('Email not exists', ServiceException::NOT_FOUND_EMAIL);
        }

        $profile = Profile::firstFromEmail($email);

        if ($this->isPasswordNotCorrect($profile, $password)) {
            throw new ServiceException('Password not correct', ServiceException::NOT_CORRECT_PASSWORD);
        }

        /* логика с сессиями */
    }


Однако не совсем понятно, было бы верным делать исключения в контроллере или все же сначала спросить сервис о например существовании мыла?
Тогда как если у меня сейчас все правильно то получается если вдруг где то еще, по другому, понадобится реализовать вход в систему то придется создавать отдельный метод someAuth где например не нужны сессии и требуется отправить сообщение о входе.
Но если я делаю не правильно и лучше проводить проверку перед началом работы с сервисом то получается я не отхожу далеко от ТТУК.
  • Вопрос задан
  • 749 просмотров
Решения вопроса 1
index0h
@index0h
PHP, Golang. https://github.com/index0h
Однако не совсем понятно, было бы верным делать исключения в контроллере или все же сначала спросить сервис о например существовании мыла?

Вы и так обрабатываете этот момент в catch блоке. Ваша реализация - ок.

switch ($e->getCode())

Лучше заведите больше исключений и используйте несколько catch.

придется создавать отдельный метод someAuth где например не нужны сессии и требуется отправить сообщение о входе.

Когда понадобится - напилите под этот тип авторизации отдельный сервис.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
10 авг. 2020, в 14:44
4000 руб./за проект
10 авг. 2020, в 14:30
1500 руб./в час
10 авг. 2020, в 14:21
1500 руб./в час