Необходимо сделать активацию аккаунта пользователя.
Есть сущность user, с методом активации:
User entityclass 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'));
}
UserActivatorclass 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 и не будет ли большого разрастания подобных классов, если после изменения состояния сущность нужно будет сохранить изменения в бд?
Вобщем как правильно сделать?