Сессии и инфа об юзере

Сессии храню в БД.

Так же в табличку сессий добавил поле UserID, в которое сохраняю ID текущего пользователя.

Сделал свой класс наследник от CDbHttpSession.

Так же отнаследовался от CWebUser и сделал там метод:




class WebUser extends CWebUser 

{

    static $_model;

    public function getModel() 

    {

       if(self::$_model == null) self::$_model = User::model()->findByPk($this->id);

       return self::$_model;

    }

}



А теперь подумал, ведь можно вместо двух запросов к БД (чтение сессии и WebUser::GetModel) сделать один. И читать данные юзера прямо при чтении сессии:




SELECT FROM sessions

LEFT JOIN users ON users.UserID=session.UserID



Все бы хорошо, но чтение сессии вызывается из CWebUser::init, и я не могу в методе readSession достучаться до Yii::app()->user, ибо он еще тогда NULL.

Отсюда вопрос, как наиболее кошерно сделать заполнение модели $_model в WebUser при чтении сессии?

to iGrog

Вообще ИМХО это экономия на спичках, к тому же в ущерб архитектуре приложения. Ведь у пользователя ещё может быть и профиль. Его мы тоже можем захотеть выдернуть вместе со всем в один запрос. А в другом приложении у нас профиля может и не быть. Я лично за универсальные компоненты. Но вашу задачу можно помочь решить чисто из спортивного интереса. Но для начала объясните зачем вам в методе readSession() стучаться до Yii::app()->user. Дайте больше деталей.

Экономия не экономия, но если всё равно каждый раз дергается сессия из БД, зачем делать лишний запрос?

Решил вопрос так: в своем классе сессии сделал поле $_userModel, и его заполняю из запроса.

Далее в классе WebUser переопределили init:




    public function init()

    {

        parent::init();

        self::$_model = Yii::app()->getSession()->GetUserModel();

    }



Теперь все отлично пашет. Один запросик и модель текущего юзера заполняется.