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