Как правильно сделать с точки зрения ООП и здравого смысла?

Необходимо сделать активацию аккаунта пользователя.

Есть сущность user, с методом активации:
User entity

class User
{
    private $is_active = false;

    public function activate(string $activation_token) : void
    {
        if ($activation_token !== $this->getActivationToken()) {
            throw new UserActivationFailException();
        }

        $this->is_active = true;
    }

    public function getActivationToken() : string
    {
        //генерация ключа активации
    }
}


И реализация активации:
Экшн контроллера

public function completeSignUpAction(Request $request) : Response
{
    $email = mb_strtolower(trim($request->get('email')), 'UTF-8');
    $activation_token = trim($request->get('token'));

    //валидация

    $entity_manager = $this->getDoctrine()->getManager();

    try {
        //ну или в контейнер можно положить
        (new UserActivator($entity_manager))->activate($email, $activation_token);

    } catch (UserActivationFailException $e) {

        throw new NotFoundHttpException();
    }

    return new RedirectResponse($this->generateUrl('login'));
}


UserActivator

class UserActivator
{
    private $entity_manager;

    public function __construct(EntityManager $entity_manager)
    {
        $this->entity_manager = $entity_manager;
    }

    public function activate(string $email, string $activation_token) : void
    {
        //проверка входных данных

        $user_repository = $this->entity_manager->getRepository(User::class);

        $user = $user_repository->findOneBy(['email' => $email]);

        if (is_null($user)) {
            throw new UserActivationFailException();
        }

        $user->activate($activation_token);
        $this->entity_manager->flush($user);
    }
}


По логике ответственность за активацию конкретного аккаунта несет сущность User т.к. ей хватает данных для этого.
Но если я правильно понял, то сущность не должна иметь доступ к своему репозиторию. И чтобы сохранить в бд изменения необходимо завернуть активацию в сервис и передать в него зависимости неоходимые для сохранения в бд. Или я не правильно понял?

Правильно ли делать такие сервисы как UserActivator и не будет ли большого разрастания подобных классов, если после изменения состояния сущность нужно будет сохранить изменения в бд?

Вобщем как правильно сделать?
  • Вопрос задан
  • 562 просмотра
Решения вопроса 1
@heartdevil
плыву как воздушный шарик
За симофони не скажу, но да. Все примерно так, как вы описали. Внедряете зависимости репозитариев в сервисы, сервисы внедряете в контроллеры и работаете с сервисами в экшенах контроллеров. Разных сервисов может быть куча.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы