Одинаковые запросы в виджетах лэйаута
-
- Сообщения: 65
- Зарегистрирован: 2014.01.13, 10:03
Одинаковые запросы в виджетах лэйаута
Добрый день!
Есть хедер и футер. Они сделаны виджетами и вставлены в лэйаут. Для своего отображения они используют одинаковый запрос в базу. Как и где более правильно сделать запрос, чтобы передать эти данные через лэйаут в эти виджеты, чтобы не делать один и тот же запрос 2 раза?
Есть хедер и футер. Они сделаны виджетами и вставлены в лэйаут. Для своего отображения они используют одинаковый запрос в базу. Как и где более правильно сделать запрос, чтобы передать эти данные через лэйаут в эти виджеты, чтобы не делать один и тот же запрос 2 раза?
Re: Одинаковые запросы в виджетах лэйаута
через созданную функцию в моделе
Re: Одинаковые запросы в виджетах лэйаута
создать компонент, в котором хранить в переменной результат запроса.Vitalik_yii писал(а):Добрый день!
Есть хедер и футер. Они сделаны виджетами и вставлены в лэйаут. Для своего отображения они используют одинаковый запрос в базу. Как и где более правильно сделать запрос, чтобы передать эти данные через лэйаут в эти виджеты, чтобы не делать один и тот же запрос 2 раза?
Код: Выделить всё
if ($this->result === null) {
// делаем запрос
$this->result = ....;
}
return $this->result;
Re: Одинаковые запросы в виджетах лэйаута
причем тут вообще модель?astronin писал(а):через созданную функцию в моделе
-
- Сообщения: 65
- Зарегистрирован: 2014.01.13, 10:03
Re: Одинаковые запросы в виджетах лэйаута
Понял, спасибо!zelenin писал(а):создать компонент, в котором хранить в переменной результат запроса.Vitalik_yii писал(а):Добрый день!
Есть хедер и футер. Они сделаны виджетами и вставлены в лэйаут. Для своего отображения они используют одинаковый запрос в базу. Как и где более правильно сделать запрос, чтобы передать эти данные через лэйаут в эти виджеты, чтобы не делать один и тот же запрос 2 раза?Код: Выделить всё
if ($this->result === null) { // делаем запрос $this->result = ....; } return $this->result;
Re: Одинаковые запросы в виджетах лэйаута
запрос делается в моделе, о чем спрашивал Виталикzelenin писал(а):причем тут вообще модель?astronin писал(а):через созданную функцию в моделе
Re: Одинаковые запросы в виджетах лэйаута
блажен кто веруетastronin писал(а):запрос делается в моделе, о чем спрашивал Виталикzelenin писал(а):причем тут вообще модель?astronin писал(а):через созданную функцию в моделе
Re: Одинаковые запросы в виджетах лэйаута
возможно zelelnin имеет в виду, что в yii модель это тоже компонентзапрос делается в моделе, о чем спрашивал Виталик
За время общения на форуме с zelenin я понял, что он придерживается подхода вынесения логики в сервисный слой, над слоем моделей, которые служат для доступа к данным. Этот подход очень хороший т.к. вы не перегружаете модель.
Я бы тоже не рекомендовал выносить все методы в одной модель AR. Создайте например компонент Finder, который предоставляет методы для поиска данных. На худой конец создайте новый класс, например, UserFind, унаследованный от User и уже там делайте методы поиска.
Подход с сервисным слоем имеет преимущество. Все части вашего приложения общаются лишь с ним и в случае чего вы можете легко заменить слой моделей, например, уйти от AR или заменить sql на noSQL, при это вам нужно будет лишь отрефакторить служебный компонент, а сигнатуры методов при этом останутся прежними и все остальные части вашего приложения как работали так и будут работать т.к. они и не должны знать о том как в службе все реализовано.
Re: Одинаковые запросы в виджетах лэйаута
я имею в виду, что запрос соверешнно необязательно делается в модели. Да и вообще о модели здесь речи не шло.unclead писал(а):возможно zelelnin имеет в виду, что в yii модель это тоже компонентзапрос делается в моделе, о чем спрашивал Виталик
Re: Одинаковые запросы в виджетах лэйаута
@unclead
Про наследование от моделей - это называется Search и активно используется для grid-ов в yii2. Прелесть данного объекта в том, что он добавляет уровень абстракции и позволяет объединять несколько моделей без головной боли, какую модель использовать.
Про второе(сервисы) не понял... где вы предлагаете все же держать сам код запроса к базе, в моделе или в сервисном компоненьте?
Если в моделе, то то что вы предлагаете называется интерфейсом.
Если в сервисе, то разница между sql и nosql отличается только одним методом, который возвращает либо название таблицы либо коллекции(не говоря уже об уходе от AR), в связи с чем делать практически пустую модель как-то странно... Вообще такой подход используется в java, но там вообще много подобных абстракци на что влияет специфика языка, а у нас все же PHP и yii2 нормально позволяет не перегружать модель. Опять же, если всю логику из (предположим) перегруженной моделей в сервис, то уже сервис окажется перегруженным... и в чем прикол?
Так что выносить запросы из моделей я бы не советовал, потому как искать его потом будет гораздо легче и рефакторить гораздо легче. Максимум использовать trait, в принципе такой подход работает, удобно получается.
Про наследование от моделей - это называется Search и активно используется для grid-ов в yii2. Прелесть данного объекта в том, что он добавляет уровень абстракции и позволяет объединять несколько моделей без головной боли, какую модель использовать.
Про второе(сервисы) не понял... где вы предлагаете все же держать сам код запроса к базе, в моделе или в сервисном компоненьте?
Если в моделе, то то что вы предлагаете называется интерфейсом.
Если в сервисе, то разница между sql и nosql отличается только одним методом, который возвращает либо название таблицы либо коллекции(не говоря уже об уходе от AR), в связи с чем делать практически пустую модель как-то странно... Вообще такой подход используется в java, но там вообще много подобных абстракци на что влияет специфика языка, а у нас все же PHP и yii2 нормально позволяет не перегружать модель. Опять же, если всю логику из (предположим) перегруженной моделей в сервис, то уже сервис окажется перегруженным... и в чем прикол?
Так что выносить запросы из моделей я бы не советовал, потому как искать его потом будет гораздо легче и рефакторить гораздо легче. Максимум использовать trait, в принципе такой подход работает, удобно получается.
Re: Одинаковые запросы в виджетах лэйаута
у меня есть ощущение, что вы не понимаете о чем тут речь вообще.astronin писал(а):@unclead
Про наследование от моделей - это называется Search и активно используется для grid-ов в yii2. Прелесть данного объекта в том, что он добавляет уровень абстракции и позволяет объединять несколько моделей без головной боли, какую модель использовать.
Про второе(сервисы) не понял... где вы предлагаете все же держать сам код запроса к базе, в моделе или в сервисном компоненьте?
Если в моделе, то то что вы предлагаете называется интерфейсом.
Если в сервисе, то разница между sql и nosql отличается только одним методом, который возвращает либо название таблицы либо коллекции(не говоря уже об уходе от AR), в связи с чем делать практически пустую модель как-то странно... Вообще такой подход используется в java, но там вообще много подобных абстракци на что влияет специфика языка, а у нас все же PHP и yii2 нормально позволяет не перегружать модель. Опять же, если всю логику из (предположим) перегруженной моделей в сервис, то уже сервис окажется перегруженным... и в чем прикол?
Так что выносить запросы из моделей я бы не советовал, потому как искать его потом будет гораздо легче и рефакторить гораздо легче. Максимум использовать trait, в принципе такой подход работает, удобно получается.
Представим, что у автора два места, в которых нужно выводить кол-во постов на сайте (Post::find()->count() или более сложная выборка через (new Query) или прямой запрос в базу через createCommand()). Он спрашивает, где делать запрос и как, чтобы запрос не выполнялся два раза.
Причем тут "делать запрос в модели"? Что вы имеете в виду под этим?
Re: Одинаковые запросы в виджетах лэйаута
я имею в виду что обращение к базе надо оборачивать в отдельные методы, например findAllBySomething, getFeaturedPost и т.п. и деражть их в слое сервисных компонентов. Чтобы не получилось так как делают многие, например, в контролере делаютПричем тут "делать запрос в модели"? Что вы имеете в виду под этим?
и передают это во вью или еще хуже делают такое в самой вью.$posts = Post::find()->orderBy(..)->all()
Когда логика выборки данных собрана в одном месте, а не раскидана по контролерам, вьюхам и т.п. код становится намного более поддерживаем и легко чиаемым.
Re: Одинаковые запросы в виджетах лэйаута
но причем тут модель, если вы говорите про сервисы?unclead писал(а):я имею в виду что обращение к базе надо оборачивать в отдельные методы, например findAllBySomething, getFeaturedPost и т.п. и деражть их в слое сервисных компонентов. Чтобы не получилось так как делают многие, например, в контролере делаютПричем тут "делать запрос в модели"? Что вы имеете в виду под этим?и передают это во вью или еще хуже делают такое в самой вью.$posts = Post::find()->orderBy(..)->all()
Когда логика выборки данных собрана в одном месте, а не раскидана по контролерам, вьюхам и т.п. код становится намного более поддерживаем и легко чиаемым.
Да, делать отдельные методы - хорошая тема.
Re: Одинаковые запросы в виджетах лэйаута
кажется это был мне вопрос )zelenin писал(а):Причем тут "делать запрос в модели"? Что вы имеете в виду под этим?
имею ввиду то, что написал unclead, только методы эти писать не в сервисе, а в моделе, т.к. в данном случае считаю серсвисы лишним усложнением.
Re: Одинаковые запросы в виджетах лэйаута
понимаете, модель - это набор определенных данных (строка из БД). А вы пытаетесь ее сделать еще и сервисом с наобором каких-то методов - т.е. finder'ом. Это неверно.astronin писал(а):кажется это был мне вопрос )zelenin писал(а):Причем тут "делать запрос в модели"? Что вы имеете в виду под этим?
имею ввиду то, что написал unclead, только методы эти писать не в сервисе, а в моделе, т.к. в данном случае считаю серсвисы лишним усложнением.
Re: Одинаковые запросы в виджетах лэйаута
для уточнения, под сервисом вы имеете ввиду какой-то отдельный компонент с набором методов, для каждой моделе по сервису (хранить это все, к примеру, в папке components)? или объект наследуемый от модели?zelenin писал(а): понимаете, модель - это набор определенных данных (строка из БД). А вы пытаетесь ее сделать еще и сервисом с наобором каких-то методов - т.е. finder'ом. Это неверно.
Re: Одинаковые запросы в виджетах лэйаута
под сервисом я имею в виду обслуживающий компонент любого вида.astronin писал(а):для уточнения, под сервисом вы имеете ввиду какой-то отдельный компонент с набором методов, для каждой моделе по сервису (хранить это все, к примеру, в папке components)? или объект наследуемый от модели?zelenin писал(а): понимаете, модель - это набор определенных данных (строка из БД). А вы пытаетесь ее сделать еще и сервисом с наобором каких-то методов - т.е. finder'ом. Это неверно.
Смотрите, для данного метода нужно еще хранить где-то результат. Чтобы сохранить результат, надо завести в модели переменную (например $postsCount - пример указал выше). Таких методов может быть много, соответственно в модели появится столько же переменных. А какое отношение эти переменные имеют к модели Post? Никакого.
Re: Одинаковые запросы в виджетах лэйаута
zelenin более точно передал то что я хотел донести в своем посте выше, который на самом деле был лишним т.к. по основной теме в самом начале был корректный ответ
создать компонент, в котором хранить в переменной результат запроса.
КОД: ВЫДЕЛИТЬ ВСЁ
if ($this->result === null) {
// делаем запрос
$this->result = ....;
}
return $this->result;
Re: Одинаковые запросы в виджетах лэйаута
это да, хранить лучше в компоненте