routes.phpの設定

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
CakePHPにはroutes.phpってのがあって、そこでURLの制御なんかができるんですけど、今までこのファイルをいじったことってあまりなかったので、ちょっと後学のためにいじってみることにしました。

今までこのサイトのURLはこんな感じでした。ドメイン名は省略して、コントローラー名以下だけ書きます。

//ちょみじか(小説の間)
/novels/index/1

//ちょいなが(小説の間)
/novels/index/3

//あっぷてんぽ(音楽の間)
/musics/index/1

ちょみじかだろうとちょいながだろうと、持って来るデータが違うだけでアクションでやってる処理は一緒なので、全部同じアクションの中で処理してるんですよ。DBにカテゴリのIDを持たせているので、それで場合分けするって感じですね。

でも、例えばこれを以下のようなURLに変えたいとしましょう。というか、実際に変えてみましょう。

//ちょみじか
/novels/short

//ちょいなが
/novels/long

//あっぷてんぽ
/musics/up

まあ、処理自体は共通化したメソッドでも用意しといて、それぞれの分だけアクションを作ったって良いんですけどね。今回はroutes.phpの扱いに慣れるのが目的なので、それはやらない方向で。

やりたいことは、/novels/short/だろうと/novels/longだろうと、novels_controllerのindexが呼ばれるように設定することです。
routes.phpに以下のような文を記述します。

//ちょみじか
Router::connect('/novels/short/', array('controller' => 'novels', 'action' => 'index', 1));

//ちょいなが
Router::connect('/novels/long/', array('controller' => 'novels', 'action' => 'index', 2));

//あっぷてんぽ
Router::connect('/musics/up', array('controller' => 'musics', 'action' => 'index', 1));

こうやっておけば、例えば/novels/short/にアクセスしたら、/novels/index/1にアクセスしたときと同じ処理を行います。他も同様です。

もっと共通化しちゃってもいいかもしれません。今は明示的にカテゴリのIDを入れましたけど、場合分けの処理はアクションの中でやるようにして、routes.phpにはこんな風に書いても、同じことができます。

//routes.php
Router::connect('/novels/*', array('controller' => 'novels', 'action' => 'index'));

//novels_controller.php
function index() {
    switch($this->params['pass'][0]) {
        case 'short':
            //ちょみじかのページの処理を書く
            break;
    }
}

実際にやってみたところ、上記の場合、$this->params[‘pass’][0]にshortやlongの文字列が入るっぽいので、それで場合分けの判定をすれば良いと思います。

『*』っていうのはワイルドカードなので、上記のような書き方だと、/novels/の後は何を書いてもindexが呼ばれるようになりますね。$this->params[‘pass’][0]に規定の文字列以外が入ってたらエラー処理を行うとかの対策が必要かもしれません。あと、index以外にも呼ばれるアクションがある場合は、この書き方だとまずいですね。必ずindexが呼ばれちゃうので、例外処理を書くとか、やっぱりカテゴリIDを明示的に書くとか、そういうのが必要になってくると思います。



ってな感じで、こっそりリンクをいじってみました。まあ、普通に使ってる分には何も変化のない部分なので、気にすることはないです。アドレスバーに表示されるURLが若干変わってるってだけですから。

しかし、routes.phpを使いこなせるようになれば、いろいろなURLが生成できそうですね。TwitterライクなURLも作れることが分かりましたし、良い勉強になりました。
 もしかしたら何か関連しているかも? 
 みんなからのコメント 
2010年09月01日 13:45:41
Thanks big!
2010年10月19日 12:14:25
Thanks! Where to buy too a site with the domain com?