услуги Laravel с использованием модели и услуг - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь правильно обрезать свой код, и я хотел бы узнать ваше мнение по этому вопросу.Могу ли я вызвать службу в другой службе?

Я нахожу простые примеры в интернете

Вот моя архитектура:

UserController
    UserService
        User
            Fields => id, name

AliasController
    AliasService
        Alias
            Fields => id, user_id, name

1 пользователь имеет много псевдонимов Если псевдоним отсутствуетопределяется, генерируется

форма

<input type="text" name="name">
<input type="text" name="alias">

UserController

public function store(StoreUserRequest $request)
{
    $request->validated();

    $this->userService->create(request()->except(['_token']));

    return back()->with('success', 'created');
}

UserService

class UserService
{
    protected $user;
    protected $alias;

    public function __construct(User $user, AliasService $aliasService)
    {
        $this->user = $user;
        $this->alias = $alias;
    }

    public function create(array $attributes)
    {
        // create user
        $user = $this->user->create($attributes);

        // create or generate alias
        if (isset($attributes['alias'])) {
            $aliasName = $attributes['alias'];
        } else {
            $aliasName = $this->aliasService->generate($user->name);
        }

        $this->aliasService->create([
            'user_id' => $user->id,
            'alias' => $aliasName
        ]);

        return $user;
    }
}

РЕДАКТИРОВАТЬ 18/02/2019:

У меня вопрос: если мне нужно использовать один сервис в моем контроллере, как мне получить список ролей в методе создания?

Класс UserController расширяет Controller {protected $ userService;

    public function __construct(UserService $userService)
    {
        $this->userService = $userService;
    }

    public function create()
    {
        $user = new User();

        $roles = Role::all(); <= ???
        or
        $roles = $this->roleService->getAll(); <= ???

        return view('users.create', array(
            'user' => $user,
            'roles' => $roles
        ));
    }
}

1 Ответ

0 голосов
/ 16 февраля 2019

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

Сервис больше похож на класс, который посвящен определенной концепции предметной области.Цель службы - предоставить вспомогательные функции для работы с концепцией домена, которую представляет служба.

Для упрощения, например:

Возможно, у вас есть модель пользователя.Каждый пользователь может получить свои фиды Facebook.Также он может записаться на групповое обсуждение.В этом случае у вас может быть 2 услуги:

FacebookService, которые отвечают за все действия, которые вам понадобятся, связанные с публикацией в Facebook.DiscussionService, который отвечает за все действия, которые вам понадобятся в отношении групповых обсуждений.

Теперь вы можете добавить функциональность в обсуждение, чтобы опубликовать недавнее обсуждение на Facebook.Это означает, что DiscussionService может внутренне получить доступ к FacebookService, чтобы использовать его определенные вспомогательные функции.

Даже если в этом примере 2 сервиса используются вместе, все же каждый сервис делает только то, что он знает согласнопонятие домена, которому оно назначено.Если что-то выходит за рамки обслуживания, мы вызываем соответствующую сервисную функцию.Надеюсь, это поможет ...

...