【发布时间】:2012-01-04 21:09:37
【问题描述】:
有没有办法访问AppModel 类中的当前会话?
我想将当前登录用户的 ID 保存到几乎每个 INSERT/UPDATE 操作中。
【问题讨论】:
标签: session cakephp model cakephp-2.0
有没有办法访问AppModel 类中的当前会话?
我想将当前登录用户的 ID 保存到几乎每个 INSERT/UPDATE 操作中。
【问题讨论】:
标签: session cakephp model cakephp-2.0
在这里找到适用于 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;
}
}
【讨论】:
$this->Session->write('Auth.User.jwt', $jwt); 转到 CakeSession::write('Auth.User.jwt', $jwt); 以使我的代码从控制器运行到模型。
在 CakePHP 2.x 中,您可以静态使用 AuthComponent 并在模型中获取登录用户的 ID,如下所示:
$userId = AuthComponent::user('id');
【讨论】:
如果您从控制器调用保存,您可以在保存之前将会话数据包含在分配给模型的数据中:
$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.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
【讨论】: