Cakephp PHP WEB開発

【Cakephp2→4】モデル内でAuthComponentをロードする力技がある場合

※本サイトはPR表記を含みます。

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

 

-Cakephp, PHP, WEB開発
-