Cakephp: Как читать пользовательские данные в сеансе? - PullRequest
3 голосов
/ 11 октября 2010

Я хочу собрать последнюю информацию о пользователе из пользовательской модели и сохранить ее в сеансе.

, поэтому я делаю это

// Перед функцией рендеринга beforeRender () {

    if($this->Session->check('Auth.User')) {
        $this->User->recursive = -1;
        $currentUser = $this->User->read(null, $this->Session->read('Auth.User.id'));
        $this->set(compact('currentUser'));
    }

}

Работает нормально до тех пор, пока я в Пользовательмодель.

Когда я захожу на страницы, это выдает мне ошибку, потому что User-> read не работает, поскольку эта модель там не прикреплена.

Какое лучшее решение для?

  1. Мне нужна последняя информация о пользователе Loggedin на каждой странице сайта.
  2. Последняя, ​​а не Auth.User из сессии, потому что - когда я редактирую содержимое профиля, например, имя или фотографию.он по-прежнему ссылается на старые данные, которые были сохранены, когда пользователь вошел в систему.
  3. Он должен отображаться на каждой странице, например информация о пользователе Stackoverflow, вверху

alt text

Какой лучший способ сделать это?

Ответы [ 3 ]

4 голосов
/ 11 октября 2010
  1. Создать /app/app_controller.php.
  2. В этом контроллере создайте функцию beforeRender.
  3. Используйте обычные $uses.

См. книгу .

2 голосов
/ 11 октября 2010

Другие предложения, кажется, добавляют немного накладных расходов вашему приложению (загружая и запрашивая модель User для каждого запроса). Рассматривали ли вы просто обновление устаревших данных сеанса при обновлении модели пользователя?

<?php
class UsersController extends AppController {
    public function edit() {
        $userId = $this->Session->read('Auth.User.id');
        // populate form
        if (!$this->data) {
            $this->data = $this->User->read($userId, null);
            return;
        }
        // update user
        $saved = $this->User->save($this->data);
        if ($saved) {
            $user = $this->User->read(null, $this->User->id);
            $this->Session->write('Auth.User', $user['User']); // update session
            $this->Session->setFlash('Account details have been updated');
            return $this->redirect(array('action' => 'profile'));
        }
        $this->Session->setFlash('Please correct the validation errors below');
    }
}
?>

Это означает, что необходимые данные будут собираться каждый запрос без каких-либо дополнительных запросов (либо с диска, если используется хранилище сеансов php или cake, либо в виде одного запроса сеанса, если используется хранилище database).

1 голос
/ 11 октября 2010

Вы можете попробовать загрузить модель в свой beforeRender следующим образом: $this->load('User'), это должно загрузить модель для вас в каждый контроллер.http://book.cakephp.org/view/992/loadModel

...