web-dev-qa-db-ja.com

モデルのセッションへのアクセス

AppModelクラスの現在のセッションにアクセスする方法はありますか?
現在ログインしているユーザーのIDをほぼすべてのINSERT/UPDATEアクションに保存したいと思います。

17
powtac

ここで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;
    } 
}
17
powtac

CakePHP 2.xでは、AuthComponentを静的に使用して、次のようにモデルでログインしたユーザーのIDを取得できます。

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

コントローラから保存を呼び出す場合は、保存前にモデルに割り当てるデータにセッションデータを含めることができます。

$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;
   }
}

?>
9
Scott Harwell

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

3
bEn