Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: Laravel
Войти
Регистрация
Восстановить пароль
 
PariahMe
0 / 0 / 0
Регистрация: 06.03.2018
Сообщений: 22
1

Модели и паттерн "Репозиторий"

07.07.2019, 15:49. Просмотров 334. Ответов 4
Метки нет (Все метки)

Здравствуйте, уважаемые форумчане. Я новичок в сфере web-программирования и только начал учить mvc. В ходе чтения про orm и репозитории возникло несколько вопросов.
Почти любое веб-приложение имеет в себе некий функционал работы с данными. Контроллер обращается к модели за данными, которые запросил пользователь, а модель предоставляет эти данные.
Как я понимаю модель включает в себя данные и операции манипуляции с ними.
Для работы с данными в стиле ООП существуют orm, например ActiveRecord, которая реализуется через Eloquent в laravel, где каждая таблица бд это отдельный класс, а его свойста - поля таблицы.
Но мне совершенно непонятно, для чего CRUD операции выносят в репозиторий? Почему нельзя прописать их логику в классе таблицы? И прав ли я что и репозитории, и бд, и orm относятся к модели?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.07.2019, 15:49
Ответы с готовыми решениями:

Ошибка: "php не является внутренней или внешней программой"
Добрый день. Понимаю что тема очень простая, но все же никак не могу решить эту проблему. Решил...

Laravel- Eloquent "many to many". Как создать модель из дополнительной таблицы
Здравствуйте. Я новичок в фреймворках. Нужно сделать электронный документооборот. есть таблицы...

Kohana: ошибка "Kohana_HTTP_Exception [ 404 ]: The requested URL wg/menu was not found on this server"
Сделал controller_tmp(наследуется от controller_template) и controller_welcome(наследуется от...

Ошибка "The page has expired due to inactivity."
Здравствуйте. Начал изучать Laravel. Попробовал сделать роутер обычного post запроса ...

Ошибка "Disallowed Key Characters" в CodeIgniter
При отправке в CodeIgniter данных методом post из вида в контроллер появляется ошибка "Disallowed...

4
tarasalk
1460 / 913 / 349
Регистрация: 13.06.2013
Сообщений: 3,169
07.07.2019, 19:16 2
Цитата Сообщение от PariahMe Посмотреть сообщение
для чего CRUD операции выносят в репозиторий?
Так это суть репозитория. Без CRUD там ничего и нет.

Цитата Сообщение от PariahMe Посмотреть сообщение
Почему нельзя прописать их логику в классе таблицы?
Логика репозитория уже есть в ActiveRecord, пилить еще один, поверх ActiveRecord, бессмысленно.

Цитата Сообщение от PariahMe Посмотреть сообщение
И прав ли я что и репозитории, и бд, и orm относятся к модели?
Ну в общем то да. Рекомендую не заморачиваться с этим, определение MVC довольное мутное и в чистом виде его пожалуй и нет, особенно в ВЕБ. Все сводится к тому чтобы не лепить все в одну кучу.
0
sad67man
758 / 614 / 362
Регистрация: 23.08.2015
Сообщений: 1,575
13.07.2019, 18:02 3
Цитата Сообщение от PariahMe Посмотреть сообщение
И прав ли я что и репозитории, и бд, и orm относятся к модели?
Верно.
К примеру у вас может быть некое приложение, которое может работать как через браузер, так и реализован в качестве сервиса, или же им можно управлять через консольные команды.
В моем понимании модель - это описание структуры данных вместе со всеми их взаимосвязями и бизнесс логикой. Которое включает в себя много классов, т.е. модель - это грубо говоря сама программа, а контроллер - это прослойка между браузером и вашей моделью.

Цитата Сообщение от PariahMe Посмотреть сообщение
Но мне совершенно непонятно, для чего CRUD операции выносят в репозиторий? Почему нельзя прописать их логику в классе таблицы?
Допустим у нас есть некий объект. Вы внутри этого класса описываете все что связано только с ним самим. А откуда вы его берете - из базы данных или из файла, а может быть запрашиваете еще откуда-то через API. Сам объект по сути не должен ничего об этом знать. Поэтому и идет разделение на Саму сущность и репозиторий. Репозиториев может быть несколько.

ActiveRecord - это особый подход, который сделан чисто для ускорения разработки. Получается это и сама сущность, в тоже время умеет и себя сохранять в бд и делать какие-то запросы. Ее стоит рассматривать как костыль, а не какой-то супер правильный подход)

Скажу по моему опыту, так как я понимаю сам.
Для чего некоторые выносят всякие запросы в отдельный класс?
1) Тупо чтоб собрать все запросы, связанные с данной сущностью в одном месте, и если нужно будет сделать какие-то глобальные изменения, то не нужно будет бегать по всему сайту и их искать, бывало в моей практике такое, вроде везде все сделал, и все-равно где-то да пропускаешь. И это занимает кучу времени. Можно создать несколько репозиториев разбив их по вашему усмотрению. К примеру backend и frontend
2) Чтоб код был более красивым и не его не захламлять) Что упрощает чтение кода "по диагонали". Некие запросы могут быть достаточно сложными. Стороннему программисту придется остановиться и подумать, прежде чем понять, что данный кусок кода - это не то что он ищет (или наоборот). Или же если данный запрос больше не нужен то вам нужно будет удалить только одну сточку, не боясь, что задените что-то еще и т.д. и т.п. - опять же это экономит время и упрощает жизнь.

Почему не стоит эти запросы писать в сам ActiveRecord?
1) Чтоб его не захламлять. У него и так может быть много методов - разделяем по логике. Если нам нужно изменить код сущности - идем в класс ActiveRecord, если нужно изменить запросы - идем в репозиторий. И когда вы будете с ними работать, то лишние методы не будут вам попадаться на глаза и как-то мешаться.

Цитата Сообщение от tarasalk Посмотреть сообщение
Логика репозитория уже есть в ActiveRecord, пилить еще один, поверх ActiveRecord, бессмысленно.
Сам принцип ООП заключается в абстракции, которые более понятны человеку - т.е. мы не говорим так: "берем 10 записей, у которых статус равен активен, отсортированные по дате добавления и т.д. и тп", А говорим "берем записи последних новостей" - более читабельно. Если нужно будет изменить логику, то зайдем в этот метод и изменим.
Ну или другой пример
PHP
1
2
if ($post->status === Post::STATUS_NEW) {
}
ООП:
PHP
1
if ($post->isNew()) {
Пытаемся избавляться от низкоуровнего для ООП кода, пряча куда его подальше)

Вывод Репозитории экономят время как и при чтении кода, так и при его изменении. Так что смысл есть.
0
tarasalk
1460 / 913 / 349
Регистрация: 13.06.2013
Сообщений: 3,169
13.07.2019, 22:37 4
Цитата Сообщение от sad67man Посмотреть сообщение
Почему не стоит эти запросы писать в сам ActiveRecord?
1) Чтоб его не захламлять. У него и так может быть много методов - разделяем по логике. Если нам нужно изменить код сущности - идем в класс ActiveRecord, если нужно изменить запросы - идем в репозиторий. И когда вы будете с ними работать, то лишние методы не будут вам попадаться на глаза и как-то мешаться.
1) Зачем вам ActiveRecord если вы его делите на части? Делайте тогда по всем канонам чистый объект + репозиторий.
2) Я надеюсь ваши репозитории не возвращают объекты ActiveRecord, иначе это просто ужас. Читайте тут.
3) Репозиторий не для того придумали чтобы выносить туда часть логики ActiveRecord. Для этого есть другие способы, например класс фильтров.

Цитата Сообщение от sad67man Посмотреть сообщение
Сам принцип ООП заключается в абстракции, которые более понятны человеку - т.е. мы не говорим так: "берем 10 записей, у которых статус равен активен, отсортированные по дате добавления и т.д. и тп", А говорим "берем записи последних новостей" - более читабельно. Если нужно будет изменить логику, то зайдем в этот метод и изменим.
Это не про репозиторий. Вы просто извлекли метод. Его точно также можно извлечь в классе ActiveRecord. Пример - Local scope в Eloquent ORM

Цитата Сообщение от sad67man Посмотреть сообщение
PHP
1
$post->isNew()
Надеюсь это оговорка, потому что в репозитории такого кода быть не может. Такой код может быть в сущности.

Цитата Сообщение от sad67man Посмотреть сообщение
Вывод Репозитории экономят время как и при чтении кода, так и при его изменении. Так что смысл есть.
В контексте "репозиторий поверх ActiveRecord" не убедили.
0
sad67man
758 / 614 / 362
Регистрация: 23.08.2015
Сообщений: 1,575
13.07.2019, 23:17 5
Цитата Сообщение от tarasalk Посмотреть сообщение
1) Зачем вам ActiveRecord если вы его делите на части? Делайте тогда по всем канонам чистый объект + репозиторий.
Можно, но я еще не дорос до этого)
Цитата Сообщение от tarasalk Посмотреть сообщение
2) Я надеюсь ваши репозитории не возвращают объекты ActiveRecord, иначе это просто ужас. Читайте тут.
Почитал не вижу противоречий, там написано что репозиторий - это абстрактный механизм хранения для коллекций сущностей.
Цитата Сообщение от tarasalk Посмотреть сообщение
Это не про репозиторий. Вы просто извлекли метод.
Называйте как хотите)
Цитата Сообщение от tarasalk Посмотреть сообщение
Надеюсь это оговорка, потому что в репозитории такого кода быть не может. Такой код может быть в сущности.
Просто привел пример ООП, что в первом примере считается низкоуровневым кодом, наравне, если вы напишете так
PHP
1
$news = News::popular()->active()->orderBy('created_at', 'desc')->take(10)->get();
или так
PHP
1
$news = $newsRepository->getLastNews();
Второй способ более читабелен.
Цитата Сообщение от tarasalk Посмотреть сообщение
В контексте "репозиторий поверх ActiveRecord" не убедили.
Не собираюсь никого переубеждать, делайте как хотите. Я лишь выразил свою точку зрения)
0
13.07.2019, 23:17
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2019, 23:17

[RuntimeException] Could not scan for classes inside "database"
RuntimeException] Could not scan for classes inside "database" which does not appear to be a file...

Свойство "dataProvider" не может быть пустым
Дорогие форумчане, прошу помощи. Есть кусок кода, здесь я вывожу данные это таблица с данными в...

Ошибка "ERR_TOO_MANY_REDIRECTS" в Codeigniter. Как исправить?
Переношу сайт на локальный хостинг. Docker c php 5.6 , codeigniter 2.2 . После копирования всех...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru