極める routes.php
Upcoming SlideShare
Loading in...5
×
 

極める routes.php

on

  • 26,019 views

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

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

Statistics

Views

Total Views
26,019
Views on SlideShare
18,749
Embed Views
7,270

Actions

Likes
21
Downloads
101
Comments
0

24 Embeds 7,270

http://www.akiyan.com 6702
http://creazy.net 303
http://www.slideshare.net 63
http://kakomon.from.tv 58
http://test.edulio.com 43
http://planetcakephp.org 27
http://webcache.googleusercontent.com 21
http://s.deeeki.com 21
http://qube81.tumblr.com 8
http://novelog.org 3
http://ss.dotbranch.com 3
https://twitter.com 2
http://asklife.info 2
http://tentatsu.sakura.ne.jp 2
http://localhost 2
http://74.125.153.132 2
https://www.chatwork.com 1
http://sc.dotbranch.com 1
http://www.mefeedia.com 1
http://209.85.229.132 1
http://www.s17.akiyan.com 1
http://www.kakomon.from.tv 1
http://127.0.0.1 1
http://www.slideee.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

極める routes.php 極める routes.php Presentation Transcript

  • 極める routes .php by akiyan 第4 回C akeP H P 勉強会@ Tokyo at 2 0 0 9 .5 .2 2
  • 自己紹介 ● 名前:akiyan / 秋田真宏 ● 所属:株式会社ヨセミテ ● ブログ:akiyan.com ● 連載:C akeP H P で高速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
  • Paginatorにパラメータをつけるポイント コントローラーでPaginationをセットアップする ときの、 $this->paginate => array('Model' => array( 'options' => … )); がポイントです! (マニュアル未記載、日本語情報未確認)
  • パラメータ例 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の構造が垣間見えて面白いです。
  • ご清聴ありがとうございました