View
23.711
Download
1
Category
Preview:
DESCRIPTION
CakePHP勉強会#4@Tokyoでの発表資料です。
Citation preview
極める routes .php
by akiyan
第4回C akePHP勉強会@Tokyo
at 2009 .5 .22
自己紹介
● 名前:akiyan / 秋田真宏
● 所属:株式会社ヨセミテ
● ブログ:akiyan.com
● 連載:C akePHPで高速W ebアプリ開発
(g ihyo.jp)
今回の発表のゴール
● URLを自由に作れるようになります。● ビューでリンクを作るときに、
$html->url('/users/detail/' . $user['User']['id'])みたく、URLを自前で作っているところを全部直したくなります。
● Paginationで自由にパラメータを引き継げるようになります。
● routes.phpをいじるのが怖くなくなります。
目次
みなさまに質問
● routes.phpとは● 基本の書式● 応用の書式● 逆ルーティング!
● Paginatorにパラメータをつける(今日の目玉)● よくあるトラブル
みなさまに質問
routes.phpを知っている人?
routes.phpを書き換えたことがある人?
rewriteを使わずに、routes.phpだけで大抵のURLを作れる自信がある人?
routes.phpとは 1 / 2
● ルーティング。URLからコントローラやアクションを特定する処理や設定のこと。
● 例:普通なら /users/view/akiyan でアクセスするところを /member/akiyan でもアクセスできるようにする、など。
routes.phpとは 2 / 2
● 設定は app/config/routes.phpに書く。● 設定は上から順に検索され、最初にマッチした設定が適用される。
● URL中にパラメータが点在するような複雑なURL (例:/users/akiyan/blog/category/git/ )も作れる。
基本の書式
静的割りあて:action
paramsルーティングwildcard
基本の書式 [ 静的割り当て ]
● 単純にURLを置換したい。● Router::connect('/memberlist/', array(
'controller' => 'users', 'action' => 'index',);
● /users/index/ が /memberlist/ でアクセスできるようになる。
基本の書式 [ :action ]
● アクション名はURLから受け取りたい。
● '/members/:action/', array( 'controller' => 'users',)
● /users/withdraw/ が /members/withdraw/ でもアクセスできるようになる。
基本の書式 [ paramsルーティング ]
● URL中にパラメータを自由な場所に書きたい。
● '/member/:user_id/:action/', array( 'controller' => 'users',);
● /user/akiyan/active/ でアクセス● UsersController::active() が呼ばれる● $this->params['user_id']; で akiyan を参照できる。
ここでハマりポイント
● '/member/:user_id/', array( 'controller' => 'users', 'action' => 'postview',);って書いて、/user/akiyan/28でアクセスできない!
● 原因:”28”があるせいでURLルールに完全にマッチせず、ルーティングされなくなった(普通に解釈されてしまった)。
基本の書式 [ wildcard ]
● アクション関数にパラメータを渡したい。
● '/member/:user_id/post/*', array( 'controller' => 'users', 'action' => 'postview',);
● /member/akiyan/post/28● Controller::postview($post_id)● ($post_id, $sub_id = null) など、パラメータの数も可変でいける。
応用の書式
パラメータ制約静的パラメータを渡す
応用の書式 1/2 [ パラメータ制約 ]
● /posts/28 を /posts/view/28 にマッピングしたい● ただし、28の部分は数字のときだけにしたい。● Router::connect('/posts/:id/', array(
'controller' => 'posts', 'action' => 'view',), array( 'id' => '[0-9]+',));
● Router::connect()への第三匹数が登場。● 正規表現で全体にマッチすることが条件(制約)となる。
応用の書式 2/2 [ 静的パラメータ ]
● URLから静的に、コントローラにパラメータを渡したい。
● '/users/', array( 'controller' => 'users', 'action' => 'index', 'status' => 'active',);
● $this->params['status'] に 'active' が入る● 何がうれしいの?
静的パラメータで嬉しいこと
● 静的パラメータは、paramsルーティングのデフォルト値としても使える。
● '/memberlist/:status/', array( 'controller' => 'users', 'action' => 'index', 'status' => 'active',);
● /meberlist/ だと 'active' になる。
● /memberlist/withdraw/ だと 'withdraw' で上書きされる。
● ゆえに、issetしなくていい!!
逆ルーティング!
逆ルーティングとは逆ルーティングが使える箇所逆ルーティングの基本逆ルーティングの動作例
逆ルーティングとは
● ルーティングは URL からコントローラーやアクショ
ンを特定すること。
● 逆ルーティングは、コントローラー(名)やアクション
(名)から、URLを特定(作成)すること。ルーティングの
逆。
逆ルーティングが使える箇所
● HtmlHelper::link(), url()● PaginatorHelper::numbers(), next(), prev(),
etc...● Controller::redirect();● AjaxHelper …etc..● URLを渡す/URLが内部で作られるメソッドはおそらく全て。
逆ルーティングの基本
● routes.phpに書いたルーティングの設定が、そのまま逆ルーティングの設定になります。
● 完全マッチが基本です。ルーティングと同じ。
逆ルーティングの動作例 1
● Router::connect('/userlist/', array( 'controller' => 'users', 'action' => 'index',);
● $html->url(array( 'controller' => 'users', 'action' => 'index',));
● /userlist
逆ルーティングの動作例 2
● $html->url(array( 'controller' => 'users', 'action' => 'index', '?' => array('keyword' => 'fuga'), '#' => 'results',));
● /userlist?keyword=fuga#results
キー名に ? て!キー名に # て!
(マニュアル記載なし)
Paginatorにパラメータをつける
ポイントparamsルーティング
QUERY_STRING
コントローラーでPaginationをセットアップするときの、
$this->paginate => array('Model' => array(
'options' => …));
がポイントです!
(マニュアル未記載、日本語情報未確認)
Paginatorにパラメータをつけるポイント
パラメータ例 1 [ paramsルーティング ]
● '/memberlist/:status/', array(...);
● $this->paginate = array('Model' => array( 'options' => array( 'status' => 'active', ),);
● $patinator->next();
● /memberlist/active/page:2
パラメータ例 2 [ QUERY_STRING ]
● '/memberlist/', array(...)
● $this->paginate = array('Model' => array( 'options' => array( '?' => array('keyword' => 'fuga'), '#' => 'results', ),);
● /memberlist/page:2?keyword=fuga#results
注意点
● paginateするコントローラー名とアクション名
が、実行中のものと異なる場合はoptionsの中で指定が必要です。
'options' => array( 'controller' => 'users', 'action' => 'index', …),
● そんなケースは稀ですけどね。
これでもうPaginatorは怖くない!
よくあるroutes.phpのトラブル例
ルーティングをいろいろ書いていたらいつのまにかマッチしなくなった● 主な原因
● 他のルーティングに先にマッチしている。● 解決策(いずれか、または組み合わせで)
● *で書くのをやめて、paramsルーティングで設定する。
● パラメータ制約を加える。● 設定の順序を変える。
トラブル実例
● '/member/*', array( 'controller' => 'users', 'action' => 'index')'/member/:id/', array( 'controller' => 'users', 'action' => 'view')
● /member/28 でアクセスするとどうも上のルールが適用されているっぽい。
● /member/* に先にマッチしてしまっている。● /member/:id/ を先にしつつ、制約で 'id' => '[0-
9]+' を加える。(制約を加えないと今度は:idに食われる)
routes.phpデバッグのTIPS
● pr($this->params)
が便利です。
● デバッグ目的でなくても一度見ておくとCakePHPの構造が垣間見えて面白いです。
ご清聴ありがとうございました
Recommended