エンジニア引き止めセミナー資料
エンジニア引き止めセミナー資料

TwitterみたいなURL表示にしたい

まっちー

twitterをやっている方はご存知だと思いますが、twitterでユーザーのプロフィールページに行くと、URLは↓こんな感じになっていますよね。

http://twitter.com/ユーザー名(screen_name)

CakePHPで開発をしている場合、普通は、ドメイン名の下にはコントローラー名が来ます。で、その下にはアクション名が来ます。だからあるコントローラーのあるアクションを呼び出せば、URLは例えば↓こんな感じになるでしょうか。

http://ドメイン名/コントローラー名/アクション名/ユーザー名

これをtwitterと同じような表示にしたい。果たしてそんなことが可能なのかというと、可能のようです。

世の中、たいていのことは頑張れば可能になるみたいですね。世界中のカラスを白く染め上げることも、ものすごい頑張れば可能なのかもしれません。それを100%立証することは不可能ですけれど、まあそんなことはどうでもいいです。

例えば、usersというコントローラーにprofileというアクションを設け、そこでユーザーのプロフィールページを表示させたいとします。その場合は、routes.phpに以下の一文を書きます。

Router::connect('/:name/', array('controller' => 'users', 'action' => 'profile'));

この『:name』というのがポイントのようです。こうやっておくと、twitterみたいにドメイン名の下にユーザー名を書けば、usersコントローラーのprofileが呼ばれます。

//URLにアクセス
http://test.com/macchi

//コントローラー側の処理
class UsersController extends AppController {
    function profile() {
        $user_name = $this->params['url']['url'];
        echo $user_name;
    }
}

//出力結果
macchi

上記の場合だと$this->params[‘url’][‘url’]にmacchiという文字列が入って来るので、あとはそれを好きに使ってあれこれ処理すればOKです。

ただし、こういう設定にすると、例えばusersのindexを呼びたいときに『http://test.com/users』と書いても、indexメソッドを呼んではくれません。『users』というユーザー名だと認識して、profileメソッドが呼ばれます。だからこの設定にしてしまったら、indexメソッドを呼び出す場合もindexを省略せずに書くしかない(http://test.com/users/index)……と思っているのですが、何か回避策とかあるのかしら?

まあ、仮にusersという文字列が来たときだけusersコントローラーのindexを見に行くように設定したら、本当に『users』というユーザー名の人がいたときに、その人のプロフィールページ見れないもんね。だから仕方ないのかな……。

3 0 0 0