another_dream
@another_dream
Backend-разработчик, Laravel/ZF2/Yii2

Допустима ли подобная структура приложения?

Приложение на Laravel 5.4 имеет следующую структуру:

Выделено некоторое количество "сущностей" (возможно не корректно использую это понятие), например, такие как "Пользователь(User)", "Сообщения пользователя(User\Message)", "Друзья пользователя(User\Friend)".
Каждая сущность, при необходимости, имеет реализацию Repository (используя Eloquent), Service, FormModel.

Контроллер (App\Http\Controllers\UsersController).
В конструкторе внедряются нужные в данном пространстве сервисы.
Экшены используют сервисы, в которые была вынесена логика.
Если экшен требует валидации реквеста (например, форма) - в аргументах вешается реквест (FormRequest).

Сервис (App\Entities\User\Service).
Каждый сервис биндится в DI-контейнере(под эту задачу выделен сервис-провайдер с примитивным биндом синглтонов: i.imgur.com/GcIHzXY.png) по абстракции (интерфейс, App\Interfaces).
В сервис внедряется репозиторий (поверх Eloquent, да).
Сервис умеет валидировать модели через инстанс Illuminate\Validation\Validator с правилами из любой модели, которая имеет преимущества HasAttributes (аттрибуты, rules(), errorMessages() и прочее).

Repository (App\Entities\User\Repository).
Используется для доступа к данным в БД. Репозитории биндятся так же, как и сервисы, но в отдельном сервис-провайдере.

FormModel (App\Entities\User\FormModel)
Подобие Eloquent, но нет связи с БД, наследуется от базового класса Model, в котором используется HasAttributes, HasGuarded и еще несколько примесей.
Используется как временное хранилище при транспорте данных из формы в БД.
Модель заполняется (fill() по содержимому $fillable) данными из реквеста и валидируется. В БД пишутся данные, используя репозиторий, полученные из модели (обычно хватает $model->toArray()).

Описаны базовые классы для Сервиса, Репозитория и Модели (от неё наследуется FormModel).
Базовый сервис содержит набор методов, которые так или иначе используются во всех сущностях.
Аналогично с базовым репозиторием и базовой реализацией модели.
Сервис, репозиторий и разные "модели" (FormModel, например) наследуются от базовых реализаций.

На данный момент некоторые моменты оптимизируются, конечно, но в целом такая структура удовлетворяет требованиям.
Смотрел в сторону DDD, но считаю, что этот подход избыточен конкретно в этой ситуации.

Использование DDD - это рекомендации при проектировании хорошего приложения или же как один из вариантов? Какие еще подходы существуют?
Как, в общих чертах, выглядит ваше приложение?

Спасибо.
  • Вопрос задан
  • 510 просмотров
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы