Cakephp PHP WEB開発

【Cakephp2→4】モデル編: カスタムファインダーの移行

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

以前、別のCakephpアップデートプロジェクトに参画しときながら、カスタムファインダーの移行のタイミングを忘れていたので、書き残します。

Cake2からCake4への移行の順番として「モデル→コントローラー→アクションに付随したビュー」という形で作業を進めていくことが予想されます。

その中でモデルの移行を選考して、作業が進みますが、カスタムファインダはコール元に依存するため、実際に対象のカスタムファインダーがコールされる際に移行する形になります

なので、複数の箇所で汎用的にカスタムファインダがコールされている場合、しばらくはCake2とCake4の両方を呼び出せる形でキープしておく必要があります

シェルやコントローラー、ビューが順次進むにつれ、最終的にCake4側のみがコールされるという形になりますね。

 

Cake2: カスタムファインダー

例えば、Cake2側で下記のようなカスタムファインダーが定義されているとします。

// メンバ変数でカスタムファインダを利用宣言
public $findMethods = array('hogeList' => true);

protected function findHogeList($state, $query, $results = array())
{
  // カスタムファインダの処理内容
}

とすることで、各コントローラーアクション内で $this->Hoge->find('HogeList');で利用できていました。

Cake4: カスタムファインダー

use Cake\ORM\Query;

/**
 * カスタムファインダー例
 *
 * @param \Cake\ORM\Query $query クエリオブジェクト
 * @param array $options オプション
 * @return \Cake\ORM\Query クエリオブジェクト
*/
public function findHogeList(Query $query, array $options): \Cake\ORM\Query
{
    // $optionsの中身がCake2の$queryオプション内に相当する
    // Cake4では$stateは存在しない
}

Cake4では、Cake2のようにメンバ変数でカスタムファインダー宣言する必要がなくなり、publicで命名規則に沿っていればお手軽に利用できます。

コール時は $this->Hoges->find('HogeList'); で利用できます。なお、Cake2の $state は before が利用でき、フェッチ後の処理を記述できる仕様でしたが、もし、フェッチ後に結果を変更する必要があるなら、 結果を Map/Reduce で変更する 機能を使って結果を変更するようにしてください。

-Cakephp, PHP, WEB開発
-