SlideShare une entreprise Scribd logo
1  sur  35
Télécharger pour lire hors ligne
極める 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の構造が垣間見えて面白いです。
ご清聴ありがとうございました

Contenu connexe

Tendances

モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―shinjiigarashi
 
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version - ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version - Tetsutaro Watanabe
 
Spring bootでweb バリデート編
Spring bootでweb バリデート編Spring bootでweb バリデート編
Spring bootでweb バリデート編なべ
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたYoshio Hanawa
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践Yoshifumi Kawai
 
REST: From GET to HATEOAS
REST: From GET to HATEOASREST: From GET to HATEOAS
REST: From GET to HATEOASJos Dirksen
 
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介T. Suwa
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -onozaty
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来についてshinjiigarashi
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugMasatoshi Tada
 
JIRA / Confluence の 必須プラグインはこれだ
JIRA / Confluence の必須プラグインはこれだJIRA / Confluence の必須プラグインはこれだ
JIRA / Confluence の 必須プラグインはこれだNarichika Kajihara
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーyoku0825
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話y-uti
 
Rails の自動読み込みを支える技術
Rails の自動読み込みを支える技術Rails の自動読み込みを支える技術
Rails の自動読み込みを支える技術Tomohiko Himura
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とdo_aki
 
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理Takafumi Yoshida
 
ADRという考えを取り入れてみて
ADRという考えを取り入れてみてADRという考えを取り入れてみて
ADRという考えを取り入れてみてinfinite_loop
 
pytest × TDD テスト駆動開発のススメ
pytest × TDD テスト駆動開発のススメpytest × TDD テスト駆動開発のススメ
pytest × TDD テスト駆動開発のススメiRidge, Inc.
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今y-uti
 

Tendances (20)

モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version - ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
ビッグデータ処理データベースの全体像と使い分け - 2017年 Version -
 
Spring bootでweb バリデート編
Spring bootでweb バリデート編Spring bootでweb バリデート編
Spring bootでweb バリデート編
 
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみたOPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
OPcacheの新機能ファイルベースキャッシュの内部実装を読んでみた
 
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
 
REST: From GET to HATEOAS
REST: From GET to HATEOASREST: From GET to HATEOAS
REST: From GET to HATEOAS
 
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjugSpring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
 
JIRA / Confluence の 必須プラグインはこれだ
JIRA / Confluence の必須プラグインはこれだJIRA / Confluence の必須プラグインはこれだ
JIRA / Confluence の 必須プラグインはこれだ
 
Where狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキーWhere狙いのキー、order by狙いのキー
Where狙いのキー、order by狙いのキー
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
 
Rails の自動読み込みを支える技術
Rails の自動読み込みを支える技術Rails の自動読み込みを支える技術
Rails の自動読み込みを支える技術
 
PHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
 
一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理一人でもはじめるGitでバージョン管理
一人でもはじめるGitでバージョン管理
 
ADRという考えを取り入れてみて
ADRという考えを取り入れてみてADRという考えを取り入れてみて
ADRという考えを取り入れてみて
 
pytest × TDD テスト駆動開発のススメ
pytest × TDD テスト駆動開発のススメpytest × TDD テスト駆動開発のススメ
pytest × TDD テスト駆動開発のススメ
 
OPcache の最適化器の今
OPcache の最適化器の今OPcache の最適化器の今
OPcache の最適化器の今
 
Redux toolkit
Redux toolkitRedux toolkit
Redux toolkit
 

En vedette

CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏Masahiro Akita
 
10分でわかるFuelPHP @ OSC2013 Nagoya
10分でわかるFuelPHP @ OSC2013 Nagoya10分でわかるFuelPHP @ OSC2013 Nagoya
10分でわかるFuelPHP @ OSC2013 Nagoyakenjis
 
徳丸本とAmazonと僕
徳丸本とAmazonと僕徳丸本とAmazonと僕
徳丸本とAmazonと僕monmon Kumagai
 
CakePHP3で学ぶAPIマネジメント #phpconfuk
CakePHP3で学ぶAPIマネジメント #phpconfukCakePHP3で学ぶAPIマネジメント #phpconfuk
CakePHP3で学ぶAPIマネジメント #phpconfukYuta Matsumura
 
今、最も勢いのあるWebフレームワーク「fuel php」
今、最も勢いのあるWebフレームワーク「fuel php」今、最も勢いのあるWebフレームワーク「fuel php」
今、最も勢いのあるWebフレームワーク「fuel php」Soudai Sone
 
最近、僕がハマったFuelPHPの紹介
最近、僕がハマったFuelPHPの紹介最近、僕がハマったFuelPHPの紹介
最近、僕がハマったFuelPHPの紹介Naoto Mawatari
 
Bài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng web
Bài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng webBài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng web
Bài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng webMasterCode.vn
 
フラットなPHPからフレームワークへ
フラットなPHPからフレームワークへフラットなPHPからフレームワークへ
フラットなPHPからフレームワークへMasao Maeda
 

En vedette (8)

CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
CakePHPをさらにDRYにする、ドライケーキレシピ akiyan.com 秋田真宏
 
10分でわかるFuelPHP @ OSC2013 Nagoya
10分でわかるFuelPHP @ OSC2013 Nagoya10分でわかるFuelPHP @ OSC2013 Nagoya
10分でわかるFuelPHP @ OSC2013 Nagoya
 
徳丸本とAmazonと僕
徳丸本とAmazonと僕徳丸本とAmazonと僕
徳丸本とAmazonと僕
 
CakePHP3で学ぶAPIマネジメント #phpconfuk
CakePHP3で学ぶAPIマネジメント #phpconfukCakePHP3で学ぶAPIマネジメント #phpconfuk
CakePHP3で学ぶAPIマネジメント #phpconfuk
 
今、最も勢いのあるWebフレームワーク「fuel php」
今、最も勢いのあるWebフレームワーク「fuel php」今、最も勢いのあるWebフレームワーク「fuel php」
今、最も勢いのあるWebフレームワーク「fuel php」
 
最近、僕がハマったFuelPHPの紹介
最近、僕がハマったFuelPHPの紹介最近、僕がハマったFuelPHPの紹介
最近、僕がハマったFuelPHPの紹介
 
Bài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng web
Bài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng webBài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng web
Bài 1 Lập trình website theo mô hình MVC - Xây dựng ứng dụng web
 
フラットなPHPからフレームワークへ
フラットなPHPからフレームワークへフラットなPHPからフレームワークへ
フラットなPHPからフレームワークへ
 

極める 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の構造が垣間見えて面白いです。