
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() してやることで、読む込むことが可能になりました。