Mojolicious::Liteでさまざまなルートを記述する
Mojolicious::Liteでさまざまなルートを記述してみましょう。
GETメソッドとPOSTメソッド
GETメソッドによる「/」へのルートです。GETメソッドはページを取得するときや検索を行うときに利用されることが多いです。
# Via get method use Mojolicious::Lite; get '/' => sub { shift->render(text => 'Hello') }; app->start;
次はPOSTメソッドによる「/create」へのルートです。POSTメソッドは新しい記事の投稿や更新、削除などサーバーに存在するデータに対して変更を行う場合に利用されることが多いです。一般的にフォームの送信処理で利用すると考えるとよいでしょう。
# Via post method use Mojolicious::Lite; get '/' => 'index'; post '/create' => sub { my $self = shift; my $title = $self->param('title'); $self->render(text => $title); }; app->start; __DATA__ @@ index.html.ep <html> <head><title>Top Page</title></head> <body> <form method="post" action="<%= url_for '/create' %>" > <div>Title: <input type="text" name="title"></div> <div><input type="submit" value="Send"></div> </form> </body> </html>
プレースホルダーの利用
URLの中にはプレースホルダを含めることができます。「:名前」のようにコロンで始めます。プレースホルダは変数のようなものだと考えればよいでしょう。
# Place holder get '/entry/:date' => sub { my $self = shift; my $date = $self->param('date'); $self->render(text => $date); };
プレースホルダに指定した値はparamメソッドで取得することができます。
次のURLでアクセスしてみましょう。20111212と表示されます。
/entry/20111212
リラックスプレースホルダー
ところがこのプレースホルダーには.(ドット)を含めることができません。.もキャプチャしたい場合はリラックスプレースホルダを利用します。リラックスプレースホルダーは「#名前」のようにシャープで始めます。リラックスプレースホルダーについては常に括弧「()」で囲む必要があることに注意してください。(注:Mojolicious3.0くらいからはリラックスプレースホルダーの記法は「.名前」から「#名前」に変更されました。)
# Relax place holder get '/entry/(.datetime)' => sub { my $self = shift; my $datetime = $self->param('datetime'); $self->render(text => $datetime); };
次のURLでアクセスしてみましょう。20111212.102232と表示されます。
/entry/20111212.102232
ワイルドカードプレースホルダー
/(スラッシュ)も含めてマッチさせたい場合はワイルドカードプレースホルダーを使用します。
# Wildcard place holder get '/entry/*datetime' => sub { my $self = shift; my $datetime = $self->param('datetime'); $self->render(text => $datetime); };
次のURLでアクセスしてみましょう。20111212/102232と表示されます。
/entry/20111212/102232
ルートのテクニック
ふたつのルート
次のふたつのURLで同じロジックを実行したい場合はどうしたらよいでしょうか。
/entry /entry/20101111
このような場合はデフォルト値をundefに設定してあげるのがよいでしょう。そうすると上の二つのルートで同じロジックを利用できます。
# Match above two URL get '/entry/:date' => {date => undef} => sub { my $self = shift; my $date = $self->param('date') || 'undefined'; $self->render(text => $date); };
静的なルートと動的なルートの混合
静的なルートと動的なルートを混ぜたい場合はどうすればよいでしょうか。
# Static route /description # User name /kimoto /kraih /taro
その場合は静的なルートを上部に記述すればよいだけです。
# Static route get '/description' => sub { shift->render(text => 'description') }; # Dinamic route get '/:user' => sub { my $self = shift; my $user = $self->param('user'); $self->render(text => $user); };
もう少し難しいルートも記述してみましょう。GithubなどのURLなんかもこのような仕組みになっていますね。
# Description(Static) /description # User name(Dinamic) /kimoto /kraih /taro # User name and profile (Dinamic and Static) /kimoto/profile /kraih/profile /taro/profile # User name and project (Dinamic and Dinamic) /kimoto/dbix-custom /kraih/mojo /taro/foobar
# Description(Static) get '/description' => sub { shift->render(text => 'description') }; # User name(Dinamic) get '/:user' => sub { my $self = shift; my $user = $self->param('user'); $self->render(text => "User $user"); }; # User name and profile (Dinamic and Static) get '/:user/profile' => sub { my $self = shift; my $user = $self->param('user'); $self->render(text => "$user Profile"); }; # User name and project (Dinamic and Dinamic) get '/:user/:project' => sub { my $self = shift; my $user = $self->param('user'); my $project = $self->param('project'); $self->render(text => "$user $project Project"); };