Cake2からCake4への移行作業をしている最中に、モデル内で認証情報を取得するために、AuthComponent
をロードしている箇所に遭遇しました。
Cake2: モデル内にAuthComponentをロードしている箇所があった
// 例: モデル内にて public fuction getAuth() { App::uses('AuthComponent', 'Controller/Component'); $id = AuthComponent::user('id'); }
実際、Cake2ではこれで実際にコールできているわけだし、データ取得も可能。でも、フレームワーク的にはコンポーネントはあくまでコントローラーの機能であって、モデルと密接な関係ではありません。
Cake4ではモデル内で AuthComponent
を利用することは不可になります。なので、方法としては、AppController::beforeFilter()
に Configure::write()
にて、認証情報を書込み、モデルの必要箇所で Configure::read()
する形で対応すると良いと思います。(それが本当に良いのかどうかは置いといて)
Cake4: Configure::write() を利用してAuth情報を書き込んでおく
・src/Controller/AppController.php
public function beforeFilter(EventInterface $event) { parent::beforeFilter($event); // モデルからAuth情報を参照している箇所の対策として Configure::write('authUser', $this->Auth->user()); }
AppController
に 上記のようにAuth情報を書きこんでおけば、後はモデル(テーブル)内で読み込みすればOKです。
use Cake\Core\Configure; // 任意のモデルテーブルメソッド内にて読み込む private function getAuth() { // テーブル内でコンポーネント呼び出しは無理 $authId = Configure::read('authUser.id'); }
任意のモデルテーブルのメソッド内で Configure::read()
してやることで、読む込むことが可能になりました。