"Глобальный" объект

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
matios
Сообщения: 76
Зарегистрирован: 2013.03.17, 20:44
Откуда: Россия, Лиски

"Глобальный" объект

Сообщение matios »

Привет всем. Не знал как правильно назвать тему и решил оставить так. В общем вопрос такой (гугл на него не ответил к сожалению).
Возможно ли подобное в Yii?
Суть проста. Например у нас есть виджет авторизации на сайте. Он отображается НА ВСЕХ СТРАНИЦАХ.

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

if(Yii::app()->user->isGuest)
        {
            $this->render('AuthMenu');  
        }
        else{
            $model = UserProfile::model()->with('user')->findByPk(Yii::app()->user->id);
        
            $this->render('AuthMenuLoggedIn', array(
                'model'=>$model,
                ));
        }
 
Как видите если пользователь авторизован, то создается объект $model, который рендерится в AuthMenuLoggedIn. А можно ли данный объект как-либо использоваться в Экшенах контроллера (например: protected/controller/SiteController.php), чтобы не создавать там новую копию, устраивать проверки и так далее. :?: получается, что один раз создал (например в виджете) и используешь его в любом контроллере.
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: "Глобальный" объект

Сообщение anton44eg »

можно кешировать, можно в WebUser вынести
Аватара пользователя
matios
Сообщения: 76
Зарегистрирован: 2013.03.17, 20:44
Откуда: Россия, Лиски

Re: "Глобальный" объект

Сообщение matios »

Понятно, думал, может еще есть какой-либо способ) Спасибо)
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: "Глобальный" объект

Сообщение lancedevnull »

anton44eg писал(а): в WebUser вынести
большинство так делает и это верный подход имхо ;)
Аватара пользователя
TranceSmile
Сообщения: 562
Зарегистрирован: 2011.06.27, 19:04
Откуда: Украина
Контактная информация:

Re: "Глобальный" объект

Сообщение TranceSmile »

ИМХО и WebUser вынести и кешировать.
Изображение
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: "Глобальный" объект

Сообщение slavcodev »

TranceSmile писал(а):ИМХО и WebUser вынести и кешировать.
Ну и зря. Если есть кеширование то в WebUser выносить это лишнее.
Жду Yii 3!
Аватара пользователя
TranceSmile
Сообщения: 562
Зарегистрирован: 2011.06.27, 19:04
Откуда: Украина
Контактная информация:

Re: "Глобальный" объект

Сообщение TranceSmile »

mc-bear писал(а):
TranceSmile писал(а):ИМХО и WebUser вынести и кешировать.
Ну и зря. Если есть кеширование то в WebUser выносить это лишнее.
я имел ввиду кешировать модель.
Изображение
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: "Глобальный" объект

Сообщение lancedevnull »

TranceSmile писал(а):
mc-bear писал(а):
TranceSmile писал(а):ИМХО и WebUser вынести и кешировать.
Ну и зря. Если есть кеширование то в WebUser выносить это лишнее.
я имел ввиду кешировать модель.
ну так если ты кешируешь, к примеру в методе User::me() модель текущего юзера, то какой смысл ее выносить в WebUser? проще обращаться User::me()->getRelated('Profile');
Аватара пользователя
matios
Сообщения: 76
Зарегистрирован: 2013.03.17, 20:44
Откуда: Россия, Лиски

Re: "Глобальный" объект

Сообщение matios »

НУ вот смотрите, ситуация:

На сайте имеется авторизация. Если пользователь авторизован то Имя, ава, ссылка на профиль, количество постов всегда находятся в верхней панельке на каждой странице. Выводится эта панелька в виде виджета.

Так вот, чтобы вывести инфу о пользователе, приходится писать запрос на получение данных

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

$model = UserProfile::model()->cache(1000)->with('user')->findByPk(Yii::app()->user->id); 
Далее еще в каком либо виджете или контроллере нужно получить регион пользователя и вывести соответствующие данные. Регион получаем так:

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

$model = UserProfile::model()->cache(1000)->with('city')->findByPk(Yii::app()->user->id); 
Получается, что пишутся 2 запроса и данные тянутся.

Как лучше оптимизировать код?
1. Закинуть все в WebUser и закешировать, а потом получать инфу из любого места с помощью созданного метода? который тянет сразу всю нужную инфу?

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

Yii::app()->user->getUser() 
2. Или же тянуть данные из куков?
3. Или 1+2? сначала проверка куков, если пусты, то получаем данные, и заносим в куки?
4. Еще какой-либо вариант?
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: "Глобальный" объект

Сообщение lancedevnull »

1 запросом можны вытянуть и время кеша вы не оптимально юзаете
Аватара пользователя
matios
Сообщения: 76
Зарегистрирован: 2013.03.17, 20:44
Откуда: Россия, Лиски

Re: "Глобальный" объект

Сообщение matios »

Можно поподробнее, как это сделать и почему не оптимально?
Еще раз говорю, что это 2 разных виджета. Одним запросом можно вытянуть, только если вынести в WebUser. или я ошибаюсь? В принципе поэтому я тут, и поэтому задаю такие вопросы
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: "Глобальный" объект

Сообщение lancedevnull »

http://www.yiiframework.ru/doc/guide/ru/database.arr
http://www.yiiframework.ru/doc/guide/ru/caching.data > Использование кеширования запросов с ActiveRecord
Аватара пользователя
matios
Сообщения: 76
Зарегистрирован: 2013.03.17, 20:44
Откуда: Россия, Лиски

Re: "Глобальный" объект

Сообщение matios »

Я это и так читал. Вот в моем случает. Первый виджет достает инфу о пользователе. В второй виджет достает сведения о регионе пользователя. Как все построить на одном запросе, но чтобы оба виджета получили свои данные?

Насчет кэширования, вы имеете ввиду, что время сильно большое и нет $dependency ?
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: "Глобальный" объект

Сообщение lancedevnull »

matios писал(а): и нет $dependency
Аватара пользователя
matios
Сообщения: 76
Зарегистрирован: 2013.03.17, 20:44
Откуда: Россия, Лиски

Re: "Глобальный" объект

Сообщение matios »

Отсутствие $dependency объясняется следующим:

Например: открыв пост пользователя, можно увидеть сам пост + имя, фамилию и город пользователя.
И вот я пишу запрос на

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

Post::model()->cache(300, $dependency)->.. 
$dependency то будет зависеть от даты публикации поста, ведь так? а если пользователь сменит название города, тогда в посте он сразу не обновится, так как дата обновления поста совпадет с той, что была в кеше. Тогда нужно связывать дату обновления поста и дату обновления профиля. Ведь так?
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: "Глобальный" объект

Сообщение slavcodev »

При использовании кеша советую отказаться от жадной загрузки, в некоторых случаях это будет эффективнее.
Жду Yii 3!
Аватара пользователя
matios
Сообщения: 76
Зарегистрирован: 2013.03.17, 20:44
Откуда: Россия, Лиски

Re: "Глобальный" объект

Сообщение matios »

когда список постов вывожу, то я указываю какие значения выбирать.

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

$criteria->with = array(
                            'creator'=>array('select'=>'login'),
                            ...
 
Аватара пользователя
matios
Сообщения: 76
Зарегистрирован: 2013.03.17, 20:44
Откуда: Россия, Лиски

Re: "Глобальный" объект

Сообщение matios »

Собственно, вопросы последних двух моих сообщений еще актуальны. Подскажите плиз.
Аватара пользователя
S c
Сообщения: 883
Зарегистрирован: 2012.04.11, 14:46

Re: "Глобальный" объект

Сообщение S c »

загнать в сессию и обновлять эти данные в сессии при изменении
Ответить