Есть ли способ доступа к текущему сеансу в классе AppModel
?
Я хочу сохранить идентификатор текущего пользователя в состоянии почти каждого действия INSERT/UPDATE.
Доступ к сеансу в модели
Ответ 1
Найденное рабочее решение для CakePHP 2 здесь: Чтение переменной сеанса внутри поведения в 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;
}
}
Ответ 2
В CakePHP 2.x вы можете использовать AuthComponent статически и получить зарегистрированный идентификатор пользователя в модели следующим образом:
$userId = AuthComponent::user('id');
Ответ 3
Если вы вызываете сбережения с контроллера, вы можете просто включить данные сеанса в данные, которые вы назначили своей модели перед сохранением:
$data['ModelName']['session_id'] = $this->Session->id;
$this->ModelName->save($data);
Или вы можете создать переменную в своей модели и сохранить идентификатор там для использования позже:
<?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;
}
}
?>