Сервисный слой и контроллеры

Обсуждаем, как правильно строить приложения
Ответить
vk_31
Сообщения: 11
Зарегистрирован: 2013.04.23, 11:28

Сервисный слой и контроллеры

Сообщение vk_31 »

Всем добрый день!

Разрабатываю сайт, реализую сервисный слой как это сделано здесь 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 не реализовываю
Ответить