[CakePHP]paginateオプションをモデルで生成する

ネットサーフィンしていて、hiromi2424さんのPaginateオプションをモデルに移行する – 24時間CakePHPという記事を見つけて衝動的に記事を書いています。

私も普段CakePHPでpaginateを使用しているときは、モデル側でpaginateオプションを生成しています。この方針は上記記事とは変わりありません。ただ私の場合はpaginateTypeといった指標を持たずに、getPaginateStandard($options, $data)という関数を作って、パラメータを返すようにして、以下のように呼んでいます。
[phpcode]
function index(){
$options = array(‘limit’=>10, /* 省略 */);
$this->paginate = $this->Group->getPaginateStandard($options,$this->data);
$this->set(‘groups’, $this->paginate(‘Group’));
}
[/phpcode]
先程の例と違うのは、

  1. $this->paginateオプションはcontrollerに持たせている
  2. $optionsや$dataを与えることで、関数内でページネーションを拡張できる

$this->paginateオプションは先の例のように完全にモデル側に持たせるのも有りだとは思うのですが、CakePHPの標準的な仕様はController側が先に持っていて、それを処理してModel側に渡しています。出来る限りCakePHPの標準的な仕様に合わせたほうが、プログラムが複雑になっていったときに有利になってくるし、仕様が分かりやすいのではないかと思っています。(もしかしたら他の外部ライブラリと整合性が取れなくなったりするかも知れませんし)

もう1つ、$optionsや$dataを与えているのは、ページネーションの初期値があった上で、POSTやGET、namedなどのデータを元にページネーションを拡張していきたい場合に便利だからです。もちろん、先程の例でもできなくはないのですが、配列できっちり決まっているものを、別のタイミングで後からいじるのは私はあまり好きではなく、最初から関数だったら弄りやすいかなっという感覚の違いだと思います。あと、そもそもページネーションの内容が外的要因でコロコロ変わるプログラムだからという違いなのかも知れません。

ちなみに、なぜ「getPaginateStandard」という名前にしているのか気になるところだと思いますが、これは「(モデル内で)標準的なパラメータを取得する」という意味でこういう名前になっています。実際に作りたいものにも寄るとは思いますが、私が最近つくっているプログラムでは、モデル内にfindXxxYyyZzz()やgetListXxxYyyZzz的な関数をロジック毎に作っていますが、ほとんどのSELECT系関数は
[phpcode]
$params = array(/* その関数内での独自の定義 */);
return $this->find(‘all’, $this->getPaginateStandard($params));
[/phpcode]
みたいな感じで、パラメータを作る部分を1つの関数に集約しています。1回直すと全箇所に影響が出るというふうに思われるかも知れませんが、1つの関数を直せば全箇所に適用可能というメリットのほうを取っています。(わりと複雑な関連付けロジックを様々な箇所に使うので、共通で直せると嬉しいんです)。

今思えば「Paginate」って単語は余計だった(別のものにしたかった)と思っていますが、そのうちリファクタリングでもして直しますかね。

About: uechoco