cakePHP1.2でRESTfulなindex

これからアプリケーション作るなら、せっかくなのでRESTfulを目指したいところ、、、だが、
・URLをRESTfulにする
・indexには条件で絞り込みをつけたい
・便利なpagenatorへの対応
・smartyViewも使いたい
案の定とんでもないはめに。

RESTfulにはURIの考え方がかかせないらしい。Webアプリの場合、データベースのテーブルやレコードに対して一意なURLアドレスを名詞として対応させておいてMethodを動詞と考えて行うといえばわかりやすい。idが指定されればレコードが特定されるのでUpdateやDeleteができ、なければテーブルに対してInsertなどを行います。
cakePHPの場合、URLが「/(コントローラー)/(アクション)/(id)」というルールになっていてRESTに近いがちょっと惜しい。RESTfulではURLからアクションを省くので。

cakePHP1.2ではRuterを使ってMethodに応じてアクションに対応させてくれます。1.2.06311では
cake\libs\router.phpの118行目に記述があります。

/**
* Default HTTP request method => controller action map.
*
* @var array
* @access private
*/
var $__resourceMap = array(
array('action' => 'index', 'method' => 'GET',  'id' => false),
array('action' => 'view', 'method' => 'GET',  'id' => true),
array('action' => 'add', 'method' => 'POST',  'id' => false),
array('action' => 'edit', 'method' => 'PUT',   'id' => true),
array('action' => 'delete', 'method' => 'DELETE', 'id' => true),
array('action' => 'edit', 'method' => 'POST',  'id' => true)
);

これを有効にするには
app\config\routes.phpで
Router::mapResources('(コントローラー)');
とします。すると、
(コントローラー)/(id)にGETメソッドでアクセスすると、viewアクションに渡されます。
(ちなみに今のWWWブラウザーではGETとPOSTメソッドしか使えません) 

問題は、各メソッドに引数が指定できないこと。(この記事の結論からいえば、URLからindexは外せませんでした。)
indexメソッドではカテゴリーでの絞り込みなどを行いたいもので、従来(本来?)
function index($serch,$category) {
としてURL「(コントローラー)/index/hoge/flower/」で値を渡してやります。
値の渡し方はこの引数渡しのほかに、「(コントローラー)/index?serch=hoge&category=flower」のGETクエリー渡しもあります。
この場合はコントローラーで「$this->params['url']['serch']」で値を取得します。

さらに問題が。indexメソッドではたいていページ送りをしたいものですが、1.2ではpagenatorを使い、
コントローラー中で
$this->set('(view変数名)',$this->paginate());
VIEWで
$paginator->numbers(true)
とするだけで、
「1|2|3|4」などのページ送りリンクが生成されるのですが、上記の方法では引数が簡単には引き継がれません。

pagenatorで生成されたリンクを見ると
「(コントローラー)/index/page:2」などとなっています。この「page」は$this->params['named']['page']として取得できます。
これを利用してURLを
(コントローラー)/index/serch:hoge
(コントローラー)/index/page:2/serch:hoge/category:flower
などとして、コントローラー内では、

$option = array();
foreach($this->params['named'] as $key => $value) {
  $option['url'][$key] = $value;
}
$this->set('option', $option);

VIEW(smarty使用)では 
    {$paginator->numbers($option)}
とします。リソースが一意になったような気がします。
(cakePHPのsmartyViewの配列対応プラグイン「assign_assoc」では配列の配列がうまく扱えませんでした)