極める routes.php

35
極める routes.php by akiyan 4 CakePHP 勉強会@Tokyo at 2 0 0 9 .5 .2 2

description

CakePHP勉強会#4@Tokyoでの発表資料です。

Transcript of 極める routes.php

Page 1: 極める routes.php

極める routes .php

by akiyan

第4回C akePHP勉強会@Tokyo

at 2009 .5 .22

Page 2: 極める routes.php

自己紹介

● 名前:akiyan / 秋田真宏

● 所属:株式会社ヨセミテ

● ブログ:akiyan.com

● 連載:C akePHPで高速W ebアプリ開発

(g ihyo.jp)

Page 3: 極める routes.php

今回の発表のゴール

● URLを自由に作れるようになります。● ビューでリンクを作るときに、

$html->url('/users/detail/' . $user['User']['id'])みたく、URLを自前で作っているところを全部直したくなります。

● Paginationで自由にパラメータを引き継げるようになります。

● routes.phpをいじるのが怖くなくなります。

Page 4: 極める routes.php

目次

みなさまに質問

● routes.phpとは● 基本の書式● 応用の書式● 逆ルーティング!

● Paginatorにパラメータをつける(今日の目玉)● よくあるトラブル

Page 5: 極める routes.php

みなさまに質問

routes.phpを知っている人?

routes.phpを書き換えたことがある人?

rewriteを使わずに、routes.phpだけで大抵のURLを作れる自信がある人?

Page 6: 極める routes.php

routes.phpとは 1 / 2

● ルーティング。URLからコントローラやアクションを特定する処理や設定のこと。

● 例:普通なら /users/view/akiyan でアクセスするところを /member/akiyan でもアクセスできるようにする、など。

Page 7: 極める routes.php

routes.phpとは 2 / 2

● 設定は app/config/routes.phpに書く。● 設定は上から順に検索され、最初にマッチした設定が適用される。

● URL中にパラメータが点在するような複雑なURL (例:/users/akiyan/blog/category/git/ )も作れる。

Page 8: 極める routes.php

基本の書式

静的割りあて:action

paramsルーティングwildcard

Page 9: 極める routes.php

基本の書式 [ 静的割り当て ]

● 単純にURLを置換したい。● Router::connect('/memberlist/', array(

'controller' => 'users', 'action' => 'index',);

● /users/index/ が /memberlist/ でアクセスできるようになる。

Page 10: 極める routes.php

基本の書式 [ :action ]

● アクション名はURLから受け取りたい。

● '/members/:action/', array( 'controller' => 'users',)

● /users/withdraw/ が /members/withdraw/ でもアクセスできるようになる。

Page 11: 極める routes.php

基本の書式 [ paramsルーティング ]

● URL中にパラメータを自由な場所に書きたい。

● '/member/:user_id/:action/', array( 'controller' => 'users',);

● /user/akiyan/active/ でアクセス● UsersController::active() が呼ばれる● $this->params['user_id']; で akiyan を参照できる。

Page 12: 極める routes.php

ここでハマりポイント

● '/member/:user_id/', array( 'controller' => 'users', 'action' => 'postview',);って書いて、/user/akiyan/28でアクセスできない!

● 原因:”28”があるせいでURLルールに完全にマッチせず、ルーティングされなくなった(普通に解釈されてしまった)。

Page 13: 極める routes.php

基本の書式 [ wildcard ]

● アクション関数にパラメータを渡したい。

● '/member/:user_id/post/*', array( 'controller' => 'users', 'action' => 'postview',);

● /member/akiyan/post/28● Controller::postview($post_id)● ($post_id, $sub_id = null) など、パラメータの数も可変でいける。

Page 14: 極める routes.php

応用の書式

パラメータ制約静的パラメータを渡す

Page 15: 極める routes.php

応用の書式 1/2 [ パラメータ制約 ]

● /posts/28 を /posts/view/28 にマッピングしたい● ただし、28の部分は数字のときだけにしたい。● Router::connect('/posts/:id/', array(

'controller' => 'posts', 'action' => 'view',), array( 'id' => '[0-9]+',));

● Router::connect()への第三匹数が登場。● 正規表現で全体にマッチすることが条件(制約)となる。

Page 16: 極める routes.php

応用の書式 2/2 [ 静的パラメータ ]

● URLから静的に、コントローラにパラメータを渡したい。

● '/users/', array( 'controller' => 'users', 'action' => 'index', 'status' => 'active',);

● $this->params['status'] に 'active' が入る● 何がうれしいの?

Page 17: 極める routes.php

静的パラメータで嬉しいこと

● 静的パラメータは、paramsルーティングのデフォルト値としても使える。

● '/memberlist/:status/', array( 'controller' => 'users', 'action' => 'index', 'status' => 'active',);

● /meberlist/ だと 'active' になる。

● /memberlist/withdraw/ だと 'withdraw' で上書きされる。

● ゆえに、issetしなくていい!!

Page 18: 極める routes.php

逆ルーティング!

逆ルーティングとは逆ルーティングが使える箇所逆ルーティングの基本逆ルーティングの動作例

Page 19: 極める routes.php

逆ルーティングとは

● ルーティングは URL からコントローラーやアクショ

ンを特定すること。

● 逆ルーティングは、コントローラー(名)やアクション

(名)から、URLを特定(作成)すること。ルーティングの

逆。

Page 20: 極める routes.php

逆ルーティングが使える箇所

● HtmlHelper::link(), url()● PaginatorHelper::numbers(), next(), prev(),

etc...● Controller::redirect();● AjaxHelper …etc..● URLを渡す/URLが内部で作られるメソッドはおそらく全て。

Page 21: 極める routes.php

逆ルーティングの基本

● routes.phpに書いたルーティングの設定が、そのまま逆ルーティングの設定になります。

● 完全マッチが基本です。ルーティングと同じ。

Page 22: 極める routes.php

逆ルーティングの動作例 1

● Router::connect('/userlist/', array( 'controller' => 'users', 'action' => 'index',);

● $html->url(array( 'controller' => 'users', 'action' => 'index',));

● /userlist

Page 23: 極める routes.php

逆ルーティングの動作例 2

● $html->url(array( 'controller' => 'users', 'action' => 'index', '?' => array('keyword' => 'fuga'), '#' => 'results',));

● /userlist?keyword=fuga#results

Page 24: 極める routes.php

キー名に ? て!キー名に # て!

(マニュアル記載なし)

Page 25: 極める routes.php

Paginatorにパラメータをつける

ポイントparamsルーティング

QUERY_STRING

Page 26: 極める routes.php

コントローラーでPaginationをセットアップするときの、

$this->paginate => array('Model' => array(

'options' => …));

がポイントです!

(マニュアル未記載、日本語情報未確認)

Paginatorにパラメータをつけるポイント

Page 27: 極める routes.php

パラメータ例 1 [ paramsルーティング ]

● '/memberlist/:status/', array(...);

● $this->paginate = array('Model' => array( 'options' => array( 'status' => 'active', ),);

● $patinator->next();

● /memberlist/active/page:2

Page 28: 極める routes.php

パラメータ例 2 [ QUERY_STRING ]

● '/memberlist/', array(...)

● $this->paginate = array('Model' => array( 'options' => array( '?' => array('keyword' => 'fuga'), '#' => 'results', ),);

● /memberlist/page:2?keyword=fuga#results

Page 29: 極める routes.php

注意点

● paginateするコントローラー名とアクション名

が、実行中のものと異なる場合はoptionsの中で指定が必要です。

'options' => array( 'controller' => 'users', 'action' => 'index', …),

● そんなケースは稀ですけどね。

Page 30: 極める routes.php

これでもうPaginatorは怖くない!

Page 31: 極める routes.php

よくあるroutes.phpのトラブル例

Page 32: 極める routes.php

ルーティングをいろいろ書いていたらいつのまにかマッチしなくなった● 主な原因

● 他のルーティングに先にマッチしている。● 解決策(いずれか、または組み合わせで)

● *で書くのをやめて、paramsルーティングで設定する。

● パラメータ制約を加える。● 設定の順序を変える。

Page 33: 極める routes.php

トラブル実例

● '/member/*', array( 'controller' => 'users', 'action' => 'index')'/member/:id/', array( 'controller' => 'users', 'action' => 'view')

● /member/28 でアクセスするとどうも上のルールが適用されているっぽい。

● /member/* に先にマッチしてしまっている。● /member/:id/ を先にしつつ、制約で 'id' => '[0-

9]+' を加える。(制約を加えないと今度は:idに食われる)

Page 34: 極める routes.php

routes.phpデバッグのTIPS

● pr($this->params)

が便利です。

● デバッグ目的でなくても一度見ておくとCakePHPの構造が垣間見えて面白いです。

Page 35: 極める routes.php

ご清聴ありがとうございました