Репозитории Laravel

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

Может ли кто-то пролить свет на преимущества репозиториев Laravel 4?


редактировать

После использования репозиториев в течение некоторого времени я бы добавил следующее:

  • Хранилища обеспечивают единую ответственность
  • Репозитории должны возвращаться только при сборе объектов
  • Несмотря на то, что отдельные от инъекции зависимостей понятны братья
  • Хранение абстракции для реальной реализации хранилища (например, MySQL)
  • Более легкое тестирование

Хранилища, как в предоставленном учебнике, не являются обязательными для Laravel. Скорее, это форма инъекции IoC, которая возможна с Laravel. Любой объект, который можно аналогичным образом впрыскивать, не означает, что это репозиторий. Посмотрите видео на хороший пример от Тейлора Отуэлла, который также использует «репозиторий»: http://vimeo.com/53029232 .

В этом примере репозитория репозитория, откуда поступают данные, передается контроллеру. Пока переданные данные реализуют указанный интерфейс, контроллер может «блаженно» использовать определенные методы интерфейса, не беспокоясь о том, откуда взялись данные. Это позволяет переключать исходный источник данных, не нарушая работу вашего контроллера. Вы можете вытащить данные из файла, базы данных, внешнего API, макетного объекта или всего лишь некоторого произвольного массива. В принципе, контроллеру не нужно собирать данные, представленные репозиторием. Он может просто получать и использовать.

Хранилища помогают держать ваш контроллер в чистоте и сделать код многократного использования. функции в репозиториях могут быть доступны в одном или нескольких контроллерах, репозиториях и т. д. Кроме того, в репозитории можно логически разделить всю логику, связанную с бэкэнд (например, выборку данных из базы данных или внешних вызовов).

Одним из основных способов использования репозиториев является создание различной привязки (с использованием интерфейсов для определения ваших функций и с помощью app.bind связывать различную реализацию функции по мере необходимости). например: два отдельных репозитория (реализация родительского репозитория / интерфейса), обрабатывающие базу данных и файлы для бэкэнд-данных.

Надеюсь, это поможет. Благодаря!

Основная причина, по которой вы используете шаблон репозитория, – это возможность легко изменить источник данных. Например, по моему опыту наиболее распространенным изменением является добавление слоя кеширования, поскольку репозиторий реализует интерфейс, который вам нужно сделать, это построить новый объект, реализующий один и тот же интерфейс, с новыми методами обработки кеша и изменить привязку.

В дополнение к другим ответам здесь стоит отметить, что репозитории, используемые при использовании в Laravel, могут добавить дополнительный уровень выразительности. Возьмем, к примеру, следующее:

$users = User::whereHas("role", function($q) { $q->where('name', 'moderator'); }, '<', 1)->get(); 

Код трудно читать и неудобно смотреть. Он может быть инкапсулирован в методе репозитория и демонстрирует гораздо более четкое назначение кода:

 $users = $userRepository->getUsersWhoAreNotModerators(); 

Это также достижимо с использованием красноречивых «областей запросов», но я думаю, что использование репозитория превосходит, так как оно намного лучше относится к единому принципу ответственности и выполняется независимо от того, используете ли вы Eloquent.