
以前、別の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 で変更する 機能を使って結果を変更するようにしてください。
■ Cakephp4: カスタムファインダー
https://book.cakephp.org/4/ja/orm/retrieving-data-and-resultsets.html#custom-find-methods