@KBBS

Вопросы по архитектуре проекта: service layer и action domain responder?

не уверен, что правильно приоритезировал теги, вопросы достаточно общие. Но интересуют всёже сложившиеся подходы именно в php-проектах и в частности в проектах на Laravel.
Поехали.

В идеальном варианте контроллеры должны быть тонкими, а бизнес логика должна содержаться в сервисном слое. А сами сервисы должны быть максимально независимы от контекста, в котором они вызываются.
$userService->create(...); должен нам создать пользователя хоть мы его вызываем в рамках классического веб-приложения, хоть в апи, хоть в контексте cli.

Но должны ли сервисы содержать методы для чисто read-операций?
Вот метод контроллера:
public function show(Post $post): Response
{
    $post->load(); // Подтягиваем какие-то связи

    return ...;
}

Мне кажется, делать для этого метод в сервисе будет избыточным.
Но если поместить это в сервис, то открыв класс сервиса, мы увидим вообще все кейсы работы с сущностью "пост", а если писать это в контроллере, то логика уже чуть размазывается по приложению.

Давайте чуть усложним.
Задача: показать пользователю товары из его корзины + пять популярных товаров, которые не пересекаются с товарами, находящимися в корзине.
Тут уже содержится некоторая логика, кроме тупой выборки. Но по своей сути это всё равно два read-запроса.
Должен ли этот функционал находиться в сервисе? Рядом с методами добавления, удаления из корзины. Или же это не область ответственности сервисного слоя?

А вот если нам нужно написать поиск с множеством фильтров, сортировкой и прочим, для этого есть смысл создать некий SearchService, верно?

Следующий момент - использование ADR (action-domain-responder).
И тут уже интересует больше целесообразность такого подхода в laravel-проектах.
С одной стороны, я не вижу никаких препятствий для его использования. Actions - это по сути контроллеры одного действия. Но с другой стороны, те же ресурсные контроллеры - удобная штука. А смешивать особо не хотелось бы.
Но подход ADR привносит большее разделение, что тоже достаточно удобно.
И вопрос, а чем же всё таки являются actions? Это больше контроллеры одного действия, или больше сервисы одного действия? Поскольку в сети мнения на этот счёт расходятся.
  • Вопрос задан
  • 128 просмотров
Решения вопроса 2
@Vitsliputsli
Но если поместить это в сервис, то открыв класс сервиса, мы увидим вообще все кейсы работы с сущностью "пост", а если писать это в контроллере, то логика уже чуть размазывается по приложению.

Сервисный слой или модели в MVC - это не класс, не объект. Это код отвечающий за доменную логику, там никто Single Responsibility не отменял, делите сущности по их ответственности, и создавайте столько классов, сколько необходимо.

И вопрос, а чем же всё таки являются actions? Это больше контроллеры одного действия, или больше сервисы одного действия? Поскольку в сети мнения на этот счёт расходятся.

Очевидно, что actions - это обычные контроллеры. Вообще, ADR - это тот же MVC, с абсолютно таким же делением на controller-action, model-domain, view-responder. Автор ADR утверждает, что там связи более правильные. Но в отличиях ADR от MVC, автор приписывает MVC какие-то ужасы, типа вьюха при желании лезет в модели что-то там запрашивает и т.п., чего в MVC нет и никогда не было. Такое ощущение, что автор ADR просто открыл для себя как правильно пользоваться MVC.
Ответ написан
Комментировать
iMedved2009
@iMedved2009
Не люблю людей
Серебрянной пули нет - где то наверное лучше поиск в сервисах, где то можно запилить в scope.
Тянуть ADR в MVC - мне представляется странным. Хотя наверное может быть и где то опять же таки имеет место быть
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы