在模型中访问会话

时间:2012-01-04 21:09:37

标签: session cakephp model cakephp-2.0

有没有办法在AppModel班级中访问当前会话? 我想将当前登录用户的ID保存到几乎每个INSERT / UPDATE操作。

4 个答案:

答案 0 :(得分:17)

在这里找到CakePHP 2的工作解决方案:Reading a session variable inside a behavior in cakephp 2

这是我的AppModel:

<?php
class AppModel extends Model {

    public function beforeSave() {
        parent::beforeSave();

        if (isset($this->_schema['user_id'])) {

            // INSERT
            if (!strlen($this->id)) {

                App::uses('CakeSession', 'Model/Datasource');
                $user_id = CakeSession::read('Auth.User.id');

                $this->data[$this->alias]['user_id'] = $user_id;

            // UPDATE, don't change the user_id of the original creator.
            } else {
                unset($this->data[$this->alias]['user_id']);
            }
        }
        return true;
    } 
}

答案 1 :(得分:10)

在CakePHP 2.x中,您可以静态使用AuthComponent并在模型中获取登录用户的ID,如下所示:

$userId = AuthComponent::user('id');

答案 2 :(得分:9)

如果您从控制器调用保存,则可以在保存之前将会话数据包含在您为模型分配的数据中:

$data['ModelName']['session_id'] = $this->Session->id;
$this->ModelName->save($data);

或者您可以在模型中创建变量并将ID存储在那里以供日后使用:

<?php
//in model
class MyModel extends AppModel{
   public $session_id;
}


//in controller
$this->MyModel->session_id = $this->Session->id;
?>

如果必须在模型中使用该组件,则可以加载它。我不确定这是否会奏效。这不是一个好习惯,你应该考虑采用不同的方式。

<?php

App::uses('CakeSession', 'Model/Datasource');

class MyModel extends AppModel{
   public function beforeSave(){
       $this->data['session_id'] = $this->Session->id;

       return true;
   }
}

?>

答案 3 :(得分:2)

对于3.6及更高版本,要从Table类访问当前会话,请使用Cake\Http\Session

use Cake\Http\Session;

class UsersTable extends Table
{
    /**
     * Get user from session
     *
     * @return object
     */
    public function getUser()
    {
        $id = (new Session())->read('Auth.User.id');
        $user = TableRegistry::getTableLocator()
         ->get('Users')
         ->findById($id)
         ->first();

        return $user;
    }
}

来源:https://api.cakephp.org/3.6/class-Cake.Http.Session.html#_read