AppModel
クラスの現在のセッションにアクセスする方法はありますか?
現在ログインしているユーザーのIDをほぼすべてのINSERT/UPDATEアクションに保存したいと思います。
ここでCakePHP2の実用的な解決策を見つけました: 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;
}
}
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以降の場合、テーブルクラスから現在のセッションにアクセスするには、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