極める routes.php

27,388 views

Published on

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

Published in: Technology

極める routes.php

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

×