Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
極める 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の構造が垣間見えて面白いです。
ご清聴ありがとうございました

More Related Content

極める routes.php

  • 1. 極める routes .php by akiyan 第4 回C akeP H P 勉強会@ Tokyo at 2 0 0 9 .5 .2 2
  • 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
  • 24. キー名に ? て! キー名に # て! (マニュアル記載なし)
  • 25. Paginatorにパラメータをつける ポイント paramsルーティング QUERY_STRING
  • 26. Paginatorにパラメータをつけるポイント コントローラーでPaginationをセットアップする ときの、 $this->paginate => array('Model' => array( 'options' => … )); がポイントです! (マニュアル未記載、日本語情報未確認)
  • 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', … ), ● そんなケースは稀ですけどね。
  • 32. ルーティングをいろいろ書いていた らいつのまにかマッチしなくなった ● 主な原因 ● 他のルーティングに先にマッチしている。 ● 解決策(いずれか、または組み合わせで) ● *で書くのをやめて、paramsルーティングで設定 する。 ● パラメータ制約を加える。 ● 設定の順序を変える。
  • 33. トラブル実例 ● '/member/*', array( 'controller' => 'users', 'action' => 'index') '/member/:id/', array( 'controller' => 'users', 'action' => 'view') ● /member/28 でアクセスするとどうも上のルー ルが適用されているっぽい。 ● /member/* に先にマッチしてしまっている。 ● /member/:id/ を先にしつつ、制約で 'id' => '[0- 9]+' を加える。(制約を加えないと今度は:idに 食われる)
  • 34. routes.phpデバッグのTIPS ● pr($this->params) が便利です。 ● デバッグ目的でなくても一度見ておくと CakePHPの構造が垣間見えて面白いです。