Где лучше размещать функции загрузки данных

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Dimec
Сообщения: 13
Зарегистрирован: 2016.03.03, 21:33

Где лучше размещать функции загрузки данных

Сообщение Dimec »

Добрый день. Мне не дает покоя один вопрос, где с точки зрения логики оптимальнее размещать функции загрузки и обработки моделей? Есть два очевидных варианта, и оба с недостатками:

1. В контроллере, использовать метод вроде "findModel()", где прописать условие загрузки модели и ее обработки. Однако у этого метода недостаток заключается в невозможности вызова из другого контроллера.

2. Прописать метод поиска в классе модели, например "static findById()" Однако в этом случае, будет страдать логика сущности Модели и класс будет разрастаться, если я после получения данных из БД буду их тут же обрабатывать.
DeaTh
Сообщения: 41
Зарегистрирован: 2010.05.09, 14:30

Re: Где лучше размещать функции загрузки данных

Сообщение DeaTh »

viewtopic.php?f=19&t=34472&hilit=Service+Layer
Там много срача, но и полезного достаточно.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Где лучше размещать функции загрузки данных

Сообщение zelenin »

сервисы/репозитории
Dimec
Сообщения: 13
Зарегистрирован: 2016.03.03, 21:33

Re: Где лучше размещать функции загрузки данных

Сообщение Dimec »

zelenin писал(а):сервисы/репозитории
Можно ссылки на примеры?
Dimec
Сообщения: 13
Зарегистрирован: 2016.03.03, 21:33

Re: Где лучше размещать функции загрузки данных

Сообщение Dimec »

Почитал https://github.com/yiisoft/yii2/blob/ma ... locator.md
Как-то странно получится, часть моделей будет загружаться напрямую, часть из сервисов.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Где лучше размещать функции загрузки данных

Сообщение zelenin »

Dimec писал(а):Почитал https://github.com/yiisoft/yii2/blob/ma ... locator.md
Как-то странно получится, часть моделей будет загружаться напрямую, часть из сервисов.
по ссылке другой концепт.

Код: Выделить всё

PostService {
function getById($id) {

}

...

} 
Dimec
Сообщения: 13
Зарегистрирован: 2016.03.03, 21:33

Re: Где лучше размещать функции загрузки данных

Сообщение Dimec »

Понятно, спасибо. По сути это просто отдельный класс получается.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Где лучше размещать функции загрузки данных

Сообщение zelenin »

Dimec писал(а):Понятно, спасибо. По сути это просто отдельный класс получается.
для каждой отдельной ответственности делаем отдельный класс.
DeaTh
Сообщения: 41
Зарегистрирован: 2010.05.09, 14:30

Re: Где лучше размещать функции загрузки данных

Сообщение DeaTh »

@zelenin, у вас в публичном доступе нет проекта на yii1/2? Хотелось бы посмотреть. На GH не нашел.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Где лучше размещать функции загрузки данных

Сообщение zelenin »

DeaTh писал(а):@zelenin, у вас в публичном доступе нет проекта на yii1/2? Хотелось бы посмотреть. На GH не нашел.
не писал на yii уже почти год. самые доходчивые и близкие к yii примеры хорошей архитектуры в статьях про laravel. гуглите по ключевым словам.
Dimec
Сообщения: 13
Зарегистрирован: 2016.03.03, 21:33

Re: Где лучше размещать функции загрузки данных

Сообщение Dimec »

Тогда еще вопрос, где размещать загрузку зависимых сущностей?

Код: Выделить всё

/* A: */
$post = (new PostService())->findPost($postId);
$comments = $post->getComments();
 
или

Код: Выделить всё

/* B: */
$comments = (new CommentService())->findCommentsByPostId($postId);
 
В примере выше-то все понятно, но если getComments() будет массивным и не относящимся к PostService?
Есть какие-нибудь стандарты / best practice по этому поводу?

Можно, конечно getComments() сделать алиасом к методу CommentService и прописать в нем (new CommentService())->findByPostId($postId); ...
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Где лучше размещать функции загрузки данных

Сообщение zelenin »

Dimec писал(а):Можно, конечно getComments() сделать алиасом к методу CommentService и прописать в нем (new CommentService())->findByPostId($postId); ...
мне нравится.
помним, что в yii уже есть связи и из контекста модели post можно вызвать $post->getComments();
Ответить