Сервисный слой, как правильно?

Обсуждаем, как правильно строить приложения
Аватара пользователя
SiZE
Сообщения: 2813
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Сервисный слой, как правильно?

Сообщение SiZE »

Так сказать интересует бест практис. В рамках Yii2 есть несколько приложений (admin, rest и тп), сервисы для каждого создаются отдельно, один общий, через композицию, наследование?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Сервисный слой, как правильно?

Сообщение zelenin »

SiZE писал(а):Так сказать интересует бест практис. В рамках Yii2 есть несколько приложений (admin, rest и тп), сервисы для каждого создаются отдельно, один общий, через композицию, наследование?
я разбиваю приложение на модули. внутри модуля автономная структура, независимая от других модулей (интерфейсы). Сервисы модуля могут быть либо уникальные для модуля (PostService для PostModule) либо какие-то инфраструктурные например SlugGenerator, который подойдет для генерации слагов и для Post@PostModule и для Goods@GoodsModule - такие сервисы реализую в AppModule - общий модуль для приложения (SlugGenerator implements Post\SlugGeneratorInterface, Goods\SlugGeneratorInterface)
Следует понимать, что раз модули у нас независимые, то SlugGeneratorInterface в модулях Goods и Post могут отличаться, и поэтому общая реализация невозможна. Поэтому наверное лучший вариант - реализация на модуль.

Это мы говорим про модули. Если же у вас нет модулей, а есть одно связаное приложение без разбиения, то очевидно что один сервис будет идеальным решением. Но, имхо, приложение должно дробиться на модули.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: Сервисный слой, как правильно?

Сообщение S c »

ElisDN писал(а):
S c писал(а):Простой вопрос - связи (наши relations) где должны определятся\получаться? в модели либо в сервисе?
К примеру есть User у него есть связь Auth (которая belongs to User по user_id).
Связи никуда не деваются. Auth так и будет в $this->auth у User.
хм, а с точки зрения запроса как это реализовать? User ведь ничего о БД не знает. То есть что то типа

Код: Выделить всё

class User {
  getAuth() {
    ....
    return $service->getUserAuth($this);
  }
} 
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Сервисный слой, как правильно?

Сообщение zelenin »

S c писал(а):
ElisDN писал(а):
S c писал(а):Простой вопрос - связи (наши relations) где должны определятся\получаться? в модели либо в сервисе?
К примеру есть User у него есть связь Auth (которая belongs to User по user_id).
Связи никуда не деваются. Auth так и будет в $this->auth у User.
хм, а с точки зрения запроса как это реализовать? User ведь ничего о БД не знает. То есть что то типа

Код: Выделить всё

class User {
  getAuth() {
    ....
    return $service->getUserAuth($this);
  }
}
есть такое понятие "агрегат" - его следует заполнить сразу в репозитории. Но вот в случае с lazy load все не так красиво, хотя есть варианты. Мы это обсуждали где-то на 5 странице плюс минус.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Сервисный слой, как правильно?

Сообщение ElisDN »

S c писал(а):хм, а с точки зрения запроса как это реализовать? User ведь ничего о БД не знает.
Модель (в данном случае агрегат, так как содержит вложенные объекты) User приходит из find($id) репозитория уже заполненная всем комплектом её внутренностей:

Код: Выделить всё

class User
{
    private $id;
    private $name;
    private $auth;
    ...
}
В целях оптимизации (чтобы не грузить большие деревья связей) есть практика а агрегате хранить только его внутренние данные, а для связи с соседними агрегатами хранить только их id вместо включения их внутрь:

Код: Выделить всё

class Product
{
    private $id;
    private $name;
    private $photos;
    private $categoryId;
} 
Здесь фотографии представляют собой коллекции самих сущностей или VO, а вместо внедрения крупной категории $category хранится её $categoryId, так как она сама по себе является большим агрегатом.

Это избавляет от циклических связей, уменьшает потребление ресурсов и упрощает слежение за изменениями и событиями агрегата. Но, как побочный эффект, заставляет выносить обработки во внешние по отношению к агрегату сервисы, если для какого-то метода агрегата понадобится информация из категории. У Вона Вернона как раз описана такая альтернатива и сделан упор на продуманное планирование агрегатов в соответствуйющей главе про агрегаты.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: Сервисный слой, как правильно?

Сообщение S c »

Спасибо вам за ответы. Я начал с маленького (entity + service + repository) для каждой сущности. Со временем буду усложнять, думаю лучше так, чем бездумно сразу все "паттерны" ввести в проект. Заодно практически понимаю удобства, недостатки и проблемы.
p.s. проект не на yii и даже не на php, но этот раздел с вашими комментариями на вес золота :)
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Сервисный слой, как правильно?

Сообщение zelenin »

S c писал(а):Спасибо вам за ответы. Я начал с маленького (entity + service + repository) для каждой сущности. Со временем буду усложнять, думаю лучше так, чем бездумно сразу все "паттерны" ввести в проект. Заодно практически понимаю удобства, недостатки и проблемы.
p.s. проект не на yii и даже не на php, но этот раздел с вашими комментариями на вес золота :)
я на go писал по ddd - все везде одинаково)
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: Сервисный слой, как правильно?

Сообщение S c »

zelenin писал(а):
S c писал(а):Спасибо вам за ответы. Я начал с маленького (entity + service + repository) для каждой сущности. Со временем буду усложнять, думаю лучше так, чем бездумно сразу все "паттерны" ввести в проект. Заодно практически понимаю удобства, недостатки и проблемы.
p.s. проект не на yii и даже не на php, но этот раздел с вашими комментариями на вес золота :)
я на go писал по ddd - все везде одинаково)
на go и пишу) все что вы тут написали - абсолютно все применимо, согласен )
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Сервисный слой, как правильно?

Сообщение samdark »

Так как тема превратилась в монстра — закрываю. Отдельные вопросы — отдельные темы.
Закрыто