2010-10-11 2 views
3

Я хочу собрать самую последнюю информацию пользователя из модели пользователя и сохранить ее в сеансе.Cakephp: Как читать данные пользователя в сеансе?

так я делаю это

// перед визуализацией функцию 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 does not работает, так как эта модель не прилагается.

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

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

alt text

Что является лучшим способом сделать это?

ответ

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

См. book.

+0

прохладный. я сделал все, кроме $ uses. работает сейчас. Благодарю. это правильный способ сделать это? –

+1

Да, как говорится в документации: «Это идеальное место для создания кода, который является общим для всех ваших контроллеров». Но вы можете попробовать 'beforeFileter' вместо' beforeRender'. См. Документ для этого: http://book.cakephp.org/view/977/Controller-Methods#Callbacks-984 – Adam

+2

Также в файле beforeFilter вы можете загрузить все свои настройки безопасности, и во всех ваших контроллерах у вас будет $ this- > Auth-> user() –

1

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

2

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

<?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 хранения).

Смежные вопросы