Задать вопрос
@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? Это больше контроллеры одного действия, или больше сервисы одного действия? Поскольку в сети мнения на этот счёт расходятся.
  • Вопрос задан
  • 275 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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 - мне представляется странным. Хотя наверное может быть и где то опять же таки имеет место быть
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽