CakePHPにはroutes.phpってのがあって、そこでURLの制御なんかができるんですけど、今までこのファイルをいじったことってあまりなかったので、ちょっと後学のためにいじってみることにしました。
今までこのサイトのURLはこんな感じでした。ドメイン名は省略して、コントローラー名以下だけ書きます。
ちょみじかだろうとちょいながだろうと、持って来るデータが違うだけでアクションでやってる処理は一緒なので、全部同じアクションの中で処理してるんですよ。DBにカテゴリのIDを持たせているので、それで場合分けするって感じですね。
でも、例えばこれを以下のようなURLに変えたいとしましょう。というか、実際に変えてみましょう。
まあ、処理自体は共通化したメソッドでも用意しといて、それぞれの分だけアクションを作ったって良いんですけどね。今回はroutes.phpの扱いに慣れるのが目的なので、それはやらない方向で。
やりたいことは、/novels/short/だろうと/novels/longだろうと、novels_controllerのindexが呼ばれるように設定することです。
routes.phpに以下のような文を記述します。
こうやっておけば、例えば/novels/short/にアクセスしたら、/novels/index/1にアクセスしたときと同じ処理を行います。他も同様です。
もっと共通化しちゃってもいいかもしれません。今は明示的にカテゴリのIDを入れましたけど、場合分けの処理はアクションの中でやるようにして、routes.phpにはこんな風に書いても、同じことができます。
実際にやってみたところ、上記の場合、$this->params[‘pass’][0]にshortやlongの文字列が入るっぽいので、それで場合分けの判定をすれば良いと思います。
『*』っていうのはワイルドカードなので、上記のような書き方だと、/novels/の後は何を書いてもindexが呼ばれるようになりますね。$this->params[‘pass’][0]に規定の文字列以外が入ってたらエラー処理を行うとかの対策が必要かもしれません。あと、index以外にも呼ばれるアクションがある場合は、この書き方だとまずいですね。必ずindexが呼ばれちゃうので、例外処理を書くとか、やっぱりカテゴリIDを明示的に書くとか、そういうのが必要になってくると思います。
ってな感じで、こっそりリンクをいじってみました。まあ、普通に使ってる分には何も変化のない部分なので、気にすることはないです。アドレスバーに表示されるURLが若干変わってるってだけですから。
しかし、routes.phpを使いこなせるようになれば、いろいろなURLが生成できそうですね。Twitterライクな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も作れることが分かりましたし、良い勉強になりました。