はじめに
Mojoliciousアプリでリクエストパラメータを取得するときのメモ。
初歩的な内容ですがMojoliciousコントローラ内で
GETやPOSTされてきたパラメータを取得する際はいくつか方法があります。
今回はよく使われる3つの方法を書いてみました。
- ルーティングでキャプチャされたパラメータの取得
- Mojo::Message::Requestからのパラメータの取得
- Mojo::Parametersからのパラメータの取得
前提
plenv x carton x mojoアプリで記事を進めます。
以下、今回説明に使用するアプリの構成やらです
生成したアプリ
$ carton exec mojo generate app RequestParamSample::web
# githubのプロジェクト名を変更したかったので生成後に名前を変えてます
$ mv request_param_sampleweb mojolicious-request-param-sample
# ごにょごにょしたあとの構成
$ tree -L 3 mojolicious-request-param-sample
├── README.md
├── lib
│ └── RequestParamSample
│ ├── web
│ └── web.pm
├── public
│ ├── css
│ │ └── common.css
│ └── index.html
├── script
│ └── request_param_sampleweb
├── t
│ └── basic.t
└── templates
├── layouts
│ └── default.html.ep
├── message_request
│ └── index.html.ep
└── parameters
└── index.html.ep
# 起動&確認
$ carton exec morbo script/request_param_sampleweb
Server available at http://127.0.0.1:3000
plenv carton x mojoあたりは下記を参考にしてみてください
ルーティング
今回のルーティング(lib/RequestParamSample/web.pm)はこんな感じの前提です
package RequestParamSample::web;
use Mojo::Base 'Mojolicious';
sub startup {
my $self = shift;
my $r = $self->routes;
$r->get('/capture/:name/:age')->to('url_capture#index');
$r->get('/request')->to('message_request#index');
$r->post('/request/sample')->to('message_request#sample');
$r->get('/parameters')->to('parameters#index');
$r->post('/parameters/sample')->to('parameters#sample');
}
1;
実際のソース
今回のソースはgithubにあげてあります。
実際にみながらのほうがわかりやすいかもしれません。
https://github.com/tweeeety/mojolicious-request-param-sample
1. ルーティングでキャプチャされたパラメータの取得
mojoを使ってパラメータを受け取る一番単純な方法がこれです。
http://127.0.0.1:3000/capture/hoge/25
にアクセスした際のパラメータの取得ですね。
ルーティングにて$r->get('/capture/:name/:age')->to('url_capture#index');
と指定することでurlに含まれる任意の文字列をキャプチャして取得できます。
ソース
lib/RequestParamSample/web/Controller/UrlCapture.pm
package RequestParamSample::web::Controller::UrlCapture;
use Mojo::Base 'Mojolicious::Controller';
sub index {
my $self = shift;
$self->render('text' =>
"url : " . $self->url_for . "<br>" .
"name : " . $self->param('name') . "<br>" .
"age : " . $self->stash('age')
);
}
1;
出力結果
url : /capture/hoge/25
name : hoge
age : 25
参考
詳しくはこのあたりが参考になります
2. Mojo::Message::Requestからのパラメータの取得
コントローラの$selfにはいろいろなオブジェクトが含まれていますが
コントローラ内で$self->req
とすることで Mojo::Message::Request
にアクセスできます。
POSTする画面
formからPOSTする想定で
http://127.0.0.1:3000/request
で表示される画面にてformにこんな感じで入力した、
というていで話を進めます。
submit先はrequest/sample
。
ソース
ルーティング的には
$r->post('/request/sample')->to('message_request#sample');
のソースですね。
lib/RequestParamSample/web/Controller/MessageRequest.pm
package RequestParamSample::web::Controller::MessageRequest;
use Mojo::Base 'Mojolicious::Controller';
use Data::Dumper;
sub index {
my $self = shift;
$self->render(msg => 'mojo message request sample');
}
sub sample {
my $self = shift;
my $name = $self->req->param("name");
my $age = $self->req->param("age");
my $tel = $self->req->param("tel");
my $name2 = $self->param("name");
$self->render('text' =>
'name : ' . $name . "<br/>" .
'age : ' . $age . "<br/>" .
'tel : ' . $tel . "<br/>" .
'name2 : ' . $name2 . "<br/>"
);
}
1;
出力
name : hoge
age : 25
tel : 09011112222
name2 : hoge
参考
詳しくはこのあたりが参考になります
3. Mojo::Parametersからのパラメータの取得
さきほどの$self->req
(Mojo::Message::Requestオブジェクト)に
->params
を指定してやることで今度はMojo::Parameters
が取得できます。
ひとつひとつパラメータを取得するのではなくhash的に取得したい場合はこちらのほうが便利です。
POSTする画面
formからPOSTする想定で
http://127.0.0.1:3000/parameters
で表示される画面にてformにこんな感じで入力した感じで話を進めます。
submit先はparameters/sample
。
ソース
lib/RequestParamSample/web/Controller/Parameters.pm
package RequestParamSample::web::Controller::Parameters;
use Mojo::Base 'Mojolicious::Controller';
use Data::Dumper;
sub index {
my $self = shift;
$self->render(msg => 'mojo parameters sample');
}
sub sample {
my $self = shift;
my $params = $self->req->params;
my $params_hash = $self->req->params->to_hash;
$self->render('text' => '$params_hash : ' . Dumper $params_hash);
}
1;
出力
$params_hash : $VAR1 = { 'tel' => '09011112222', 'name' => 'hoge', 'age' => '25' };
参考
詳しくはこのあたりが参考になります
まとめ
簡単にですがMojoliciousでのパラメータ取得をまとめてみました!
自分的には$self->req->params->to_hash;
が一番使いやすいです\(^o^)/