以前、別の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