Laravel 5 О сервис-провайдерах и репозиториях

Laravel 5

laravel

О сервис-провайдерах и репозиториях

Подборка из обсуждений на stackoverflow и laravel.io

1. Комментарий со stackoverflow

Прочитав все доступные книги по Laravel на Leanpub и тонну информации из google, пришел к следующей структуре:

  1. Одна Eloquent модель для каждой таблицы базы данных
  2. Один класс репозитория для каждой Eloquent модели
  3. Класс Service для взаимодействия между классами репозиториев

Предположим, что мы работаем с базой данных видеопродуктов. Тогда у нас будут следующие Eloquent модели:

  • Movie
  • Studio
  • Director
  • Actor
  • Review

Классы репозиториев для CRUD-операций с базой данных:

  • MovieRepository
  • StudioRepository
  • DirectorRepository
  • ActorRepository
  • ReviewRepository

Каждый из этих репозиториев будет наследоваться от базового репозитория BaseRepository со следующим интерфейсом:

Service класс нам понадобится для работы с несколькими репозиториями и будет содержать бизнес-логику приложения. Контроллеры будут только взаимодействовать с Serice классами для Create, Update и Delete действий.

Например, если я хочу создать новую Movie запись в базе, то MovieController класс будет содержать следующие методы:

Будем считать, что данные возвращаются из Input::all() в методе postCreate():

Так как MovieRepository не обязан знать, как создавать записи Actor, Director или Studio в базе, то мы будем использовать MovieService класс:

Таким образом нам удается получить разумное разделение задач. Репозитории знают только о Eloquent моделях, данные которых они добавляют и извлекают в базе. Контроллеры не заботятся о репозиториях, они просто собирают данные пользователя и передают их соответствующему сервису. Сервис не заботится о том, как именно полученные данные сохраняются в базу, он просто передает данные из контроллера в нужные репозитории.

все материалы по Laravel 5