Одинаковые запросы в виджетах лэйаута

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Vitalik_yii
Сообщения: 65
Зарегистрирован: 2014.01.13, 10:03

Одинаковые запросы в виджетах лэйаута

Сообщение Vitalik_yii »

Добрый день!
Есть хедер и футер. Они сделаны виджетами и вставлены в лэйаут. Для своего отображения они используют одинаковый запрос в базу. Как и где более правильно сделать запрос, чтобы передать эти данные через лэйаут в эти виджеты, чтобы не делать один и тот же запрос 2 раза?
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Одинаковые запросы в виджетах лэйаута

Сообщение astronin »

через созданную функцию в моделе
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Одинаковые запросы в виджетах лэйаута

Сообщение zelenin »

Vitalik_yii писал(а):Добрый день!
Есть хедер и футер. Они сделаны виджетами и вставлены в лэйаут. Для своего отображения они используют одинаковый запрос в базу. Как и где более правильно сделать запрос, чтобы передать эти данные через лэйаут в эти виджеты, чтобы не делать один и тот же запрос 2 раза?
создать компонент, в котором хранить в переменной результат запроса.

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

if ($this->result === null) {
// делаем запрос
$this->result = ....;
}
return $this->result; 
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Одинаковые запросы в виджетах лэйаута

Сообщение zelenin »

astronin писал(а):через созданную функцию в моделе
причем тут вообще модель?
Vitalik_yii
Сообщения: 65
Зарегистрирован: 2014.01.13, 10:03

Re: Одинаковые запросы в виджетах лэйаута

Сообщение Vitalik_yii »

zelenin писал(а):
Vitalik_yii писал(а):Добрый день!
Есть хедер и футер. Они сделаны виджетами и вставлены в лэйаут. Для своего отображения они используют одинаковый запрос в базу. Как и где более правильно сделать запрос, чтобы передать эти данные через лэйаут в эти виджеты, чтобы не делать один и тот же запрос 2 раза?
создать компонент, в котором хранить в переменной результат запроса.

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

if ($this->result === null) {
// делаем запрос
$this->result = ....;
}
return $this->result;
Понял, спасибо!
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Одинаковые запросы в виджетах лэйаута

Сообщение astronin »

zelenin писал(а):
astronin писал(а):через созданную функцию в моделе
причем тут вообще модель?
запрос делается в моделе, о чем спрашивал Виталик
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Одинаковые запросы в виджетах лэйаута

Сообщение zelenin »

astronin писал(а):
zelenin писал(а):
astronin писал(а):через созданную функцию в моделе
причем тут вообще модель?
запрос делается в моделе, о чем спрашивал Виталик
блажен кто верует
unclead
Сообщения: 161
Зарегистрирован: 2015.03.13, 19:44

Re: Одинаковые запросы в виджетах лэйаута

Сообщение unclead »

запрос делается в моделе, о чем спрашивал Виталик
возможно zelelnin имеет в виду, что в yii модель это тоже компонент :D
За время общения на форуме с zelenin я понял, что он придерживается подхода вынесения логики в сервисный слой, над слоем моделей, которые служат для доступа к данным. Этот подход очень хороший т.к. вы не перегружаете модель.
Я бы тоже не рекомендовал выносить все методы в одной модель AR. Создайте например компонент Finder, который предоставляет методы для поиска данных. На худой конец создайте новый класс, например, UserFind, унаследованный от User и уже там делайте методы поиска.

Подход с сервисным слоем имеет преимущество. Все части вашего приложения общаются лишь с ним и в случае чего вы можете легко заменить слой моделей, например, уйти от AR или заменить sql на noSQL, при это вам нужно будет лишь отрефакторить служебный компонент, а сигнатуры методов при этом останутся прежними и все остальные части вашего приложения как работали так и будут работать т.к. они и не должны знать о том как в службе все реализовано.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Одинаковые запросы в виджетах лэйаута

Сообщение zelenin »

unclead писал(а):
запрос делается в моделе, о чем спрашивал Виталик
возможно zelelnin имеет в виду, что в yii модель это тоже компонент
я имею в виду, что запрос соверешнно необязательно делается в модели. Да и вообще о модели здесь речи не шло.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Одинаковые запросы в виджетах лэйаута

Сообщение astronin »

@unclead
Про наследование от моделей - это называется Search и активно используется для grid-ов в yii2. Прелесть данного объекта в том, что он добавляет уровень абстракции и позволяет объединять несколько моделей без головной боли, какую модель использовать.

Про второе(сервисы) не понял... где вы предлагаете все же держать сам код запроса к базе, в моделе или в сервисном компоненьте?
Если в моделе, то то что вы предлагаете называется интерфейсом.
Если в сервисе, то разница между sql и nosql отличается только одним методом, который возвращает либо название таблицы либо коллекции(не говоря уже об уходе от AR), в связи с чем делать практически пустую модель как-то странно... Вообще такой подход используется в java, но там вообще много подобных абстракци на что влияет специфика языка, а у нас все же PHP и yii2 нормально позволяет не перегружать модель. Опять же, если всю логику из (предположим) перегруженной моделей в сервис, то уже сервис окажется перегруженным... и в чем прикол?

Так что выносить запросы из моделей я бы не советовал, потому как искать его потом будет гораздо легче и рефакторить гораздо легче. Максимум использовать trait, в принципе такой подход работает, удобно получается.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Одинаковые запросы в виджетах лэйаута

Сообщение zelenin »

astronin писал(а):@unclead
Про наследование от моделей - это называется Search и активно используется для grid-ов в yii2. Прелесть данного объекта в том, что он добавляет уровень абстракции и позволяет объединять несколько моделей без головной боли, какую модель использовать.

Про второе(сервисы) не понял... где вы предлагаете все же держать сам код запроса к базе, в моделе или в сервисном компоненьте?
Если в моделе, то то что вы предлагаете называется интерфейсом.
Если в сервисе, то разница между sql и nosql отличается только одним методом, который возвращает либо название таблицы либо коллекции(не говоря уже об уходе от AR), в связи с чем делать практически пустую модель как-то странно... Вообще такой подход используется в java, но там вообще много подобных абстракци на что влияет специфика языка, а у нас все же PHP и yii2 нормально позволяет не перегружать модель. Опять же, если всю логику из (предположим) перегруженной моделей в сервис, то уже сервис окажется перегруженным... и в чем прикол?

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

Представим, что у автора два места, в которых нужно выводить кол-во постов на сайте (Post::find()->count() или более сложная выборка через (new Query) или прямой запрос в базу через createCommand()). Он спрашивает, где делать запрос и как, чтобы запрос не выполнялся два раза.
Причем тут "делать запрос в модели"? Что вы имеете в виду под этим?
unclead
Сообщения: 161
Зарегистрирован: 2015.03.13, 19:44

Re: Одинаковые запросы в виджетах лэйаута

Сообщение unclead »

Причем тут "делать запрос в модели"? Что вы имеете в виду под этим?
я имею в виду что обращение к базе надо оборачивать в отдельные методы, например findAllBySomething, getFeaturedPost и т.п. и деражть их в слое сервисных компонентов. Чтобы не получилось так как делают многие, например, в контролере делают
$posts = Post::find()->orderBy(..)->all()
и передают это во вью или еще хуже делают такое в самой вью.

Когда логика выборки данных собрана в одном месте, а не раскидана по контролерам, вьюхам и т.п. код становится намного более поддерживаем и легко чиаемым.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Одинаковые запросы в виджетах лэйаута

Сообщение zelenin »

unclead писал(а):
Причем тут "делать запрос в модели"? Что вы имеете в виду под этим?
я имею в виду что обращение к базе надо оборачивать в отдельные методы, например findAllBySomething, getFeaturedPost и т.п. и деражть их в слое сервисных компонентов. Чтобы не получилось так как делают многие, например, в контролере делают
$posts = Post::find()->orderBy(..)->all()
и передают это во вью или еще хуже делают такое в самой вью.

Когда логика выборки данных собрана в одном месте, а не раскидана по контролерам, вьюхам и т.п. код становится намного более поддерживаем и легко чиаемым.
но причем тут модель, если вы говорите про сервисы?
Да, делать отдельные методы - хорошая тема.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Одинаковые запросы в виджетах лэйаута

Сообщение astronin »

zelenin писал(а):Причем тут "делать запрос в модели"? Что вы имеете в виду под этим?
кажется это был мне вопрос :))
имею ввиду то, что написал unclead, только методы эти писать не в сервисе, а в моделе, т.к. в данном случае считаю серсвисы лишним усложнением.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Одинаковые запросы в виджетах лэйаута

Сообщение zelenin »

astronin писал(а):
zelenin писал(а):Причем тут "делать запрос в модели"? Что вы имеете в виду под этим?
кажется это был мне вопрос :))
имею ввиду то, что написал unclead, только методы эти писать не в сервисе, а в моделе, т.к. в данном случае считаю серсвисы лишним усложнением.
понимаете, модель - это набор определенных данных (строка из БД). А вы пытаетесь ее сделать еще и сервисом с наобором каких-то методов - т.е. finder'ом. Это неверно.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Одинаковые запросы в виджетах лэйаута

Сообщение astronin »

zelenin писал(а): понимаете, модель - это набор определенных данных (строка из БД). А вы пытаетесь ее сделать еще и сервисом с наобором каких-то методов - т.е. finder'ом. Это неверно.
для уточнения, под сервисом вы имеете ввиду какой-то отдельный компонент с набором методов, для каждой моделе по сервису (хранить это все, к примеру, в папке components)? или объект наследуемый от модели?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Одинаковые запросы в виджетах лэйаута

Сообщение zelenin »

astronin писал(а):
zelenin писал(а): понимаете, модель - это набор определенных данных (строка из БД). А вы пытаетесь ее сделать еще и сервисом с наобором каких-то методов - т.е. finder'ом. Это неверно.
для уточнения, под сервисом вы имеете ввиду какой-то отдельный компонент с набором методов, для каждой моделе по сервису (хранить это все, к примеру, в папке components)? или объект наследуемый от модели?
под сервисом я имею в виду обслуживающий компонент любого вида.
Смотрите, для данного метода нужно еще хранить где-то результат. Чтобы сохранить результат, надо завести в модели переменную (например $postsCount - пример указал выше). Таких методов может быть много, соответственно в модели появится столько же переменных. А какое отношение эти переменные имеют к модели Post? Никакого.
unclead
Сообщения: 161
Зарегистрирован: 2015.03.13, 19:44

Re: Одинаковые запросы в виджетах лэйаута

Сообщение unclead »

zelenin более точно передал то что я хотел донести в своем посте выше, который на самом деле был лишним т.к. по основной теме в самом начале был корректный ответ
создать компонент, в котором хранить в переменной результат запроса.
КОД: ВЫДЕЛИТЬ ВСЁ
if ($this->result === null) {
// делаем запрос
$this->result = ....;
}
return $this->result;
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: Одинаковые запросы в виджетах лэйаута

Сообщение astronin »

это да, хранить лучше в компоненте
Ответить