Разрабатываю сайт, реализую сервисный слой как это сделано здесь https://elisdn.ru/blog/105/services-and-controllers и здесь https://github.com/ElisDN/yii2-demo-shop
Мне необходимо организовать быструю регистрацию при написании комментария к товару. Имеется поле ввода комментария и, если пользователь не авторизован, появляются поля email и username. После отправки формы пользователь сразу регистрируется и комментарий отправляется.
Сейчас все это реализовано в контроллере? что архитектурно не верно:
Код: Выделить всё
if (!$userId = $form->getUserId()) {
$user = $this->authService->commentSignup($form->signup);
} else {
$user = $this->users->get($userId);
}
$comment = $product->addComment($user, $form->text, $form->parentId);
Код: Выделить всё
public function addComment(User $user, string $text, $parentId): Comment
{
$parent = $parentId ? $this->getComment($parentId) : null;
if ($parent && !$parent->isActive()) {
throw new \DomainException('Cannot add comment to inactive product.');
}
$comments = $this->comments;
$comments[] = $comment = Comment::create($user->contact_name, $user->email, $text, $parent ? $parent->id : null);
$this->updateComments($comments);
return $comment;
}
Код: Выделить всё
public function commentSignup(SignupForm $form): void
{
$user = User::commentSignup(
$form->username,
$form->email
);
$this->transaction->wrap(function () use ($user) {
$this->users->save($user);
$this->roles->assign($user->id, UserHelper::getRoleName(User::ROLE_USER));
});
// send mail
}
Вопрос: где и как архитектурно вернее производить регистрацию пользователя?
- в функции addComment добавить authService->commentSignup
- в функции addComment напрямую вызвать User::commentSignup
- создать сервис CommentService и в него инжектировать authService
- другое
загвоздка в том, что методы authService->commentSignup и обычная регистрация authService->signup имеют много общего
P.S. eventы как здесь https://github.com/ElisDN/yii2-demo-shop не реализовываю