Cakephp: How to read User Data in Session?
I wanna gather the latest information of a user from the User Model and store it in the session.
so i am doing this
// Before Render function 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'));
}
}
It works fine until am in the User model.
When i go to the pages it gives me an error because User->read doesnt work as that model is not attached there.
Whats the best solutio开发者_开发问答n for ?
- I want the latest information of the Loggedin User on every page of the site.
- Latest and not Auth.User from the session because - when i edit the profile content like name or photo. it still references to the old data that was stored when user had logged on.
- It has to be displayed on every page like the Stackoverflow User info at the top
Which is the best way to do it ?
- Create
/app/app_controller.php
. - In that controller create the
beforeRender
function. - Use the usual
$uses
.
See the book.
The other suggestions seem to be adding a bit of overhead to your application (by loading and querying the User model for each request). Have you considered simply updating the stale session data when updates occur to your User model?
<?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');
}
}
?>
This means the data you need will be gathered each request without any additional queries (either from disk if using php
or cake
session storage, or in a single session query if using database
storage).
You can try to load the model in your beforeRender like this: $this->load('User')
, this should load the model for you in every controller.
http://book.cakephp.org/view/992/loadModel
精彩评论