mojoを使った話
すでに二日くらい経過しているので、何を書こうと思っていたか忘れてしまった。
ちょっと待ってくれ。今思い出す。
・・・
そう、Mojolicious::LiteはperlのWAFなんだけれど、日本語のドキュメントが整っていたり、Google先生に聞けばたいていの問題は解決する。なので、特に書くことが無いんだ。
とはいえ、念のため自分メモを作る。
こういう振り返りは今後のためになると信じている。
Mojolicious::Liteで作る
- morbo
- 開発サーバ
- log
- デバグログ置き場
- public
- 静的ファイル置き場
- templates
- テンプレートを分けた場合の置き場
開発サーバ morbo
なんて読むんだろう?
ファイルが変更されると自動でリスタートをしてくれる。
-
- verbose を設定すると、ファイル変更のリスタートやsyntax errorなどを吐いてくれる。
- watch を設定すると初期値に加えて指定したディレクトリも監視し、変更したら更新してくれるようになる。試してない。
$ morbo ./app.pl daemon --listen http://127.0.0.1:8080 --verbose
log
ちょっとログの出し方にはまった。
Mojoliciousはmode=developmentの時にデバグログを吐く。デバグなんだからそうですよね。
mojo梱包のサーバを使うなら↓のようにすればよい。
$ ./app.pl -l *:8080 --mode=development
開発サーバとして梱包されているmorboにはmodeの指定の機能が無いようで、どうすればいいかわからない。
とりあえず、↓のようにした
app->log->level('debug'); app->start
これで、./log 以下にdevelopment.logが吐かれるようになる。
templates
特になにもしなければ、mojo::liteは__DATE__セクションからテンプレートの情報を引いてきてくれる。
けれども、ファイルが大きくなりすぎると管理しにくいので、分けたい、そんなときにこのディレクトリを使う。
例えば、"/"にindexのファイルを配置したければ、次のように。
app.pl
use Mojolicious::Lite; get '/' => sub { my $self = shift; } => 'index'; app->start;
directory
templates
- index.html.ep
app.pl
getメソッドで'/'にアクセスが来たら、index(という名前の付いた).html(ファイル形式の).ep(テンプレート)を探しに行く。__DATA__以下になければ、templates/を見に行く。
気を付けなければならないのは、読み込むべきテンプレートの指定と、拡張子に.html.epを付けなければならないこと。
.htmlはHTMLコンテンツであることを示す。
.epはmojoが扱うテンプレートハンドラーの形式。
Router
mojoのdispatcher。
リクエストメソッドとパスの指定により、ルートを決定する。
get '/' => sub { ... } => 'index'; get 'register' => sub { ... } => 'register'; post 'register' => sub { ... return $self->render_json); };
他にも、pullやheadも使えるかもしれない。
プレースホルダー
/list?page=1 というURLを /list/1 にしたい場合、以下の様にすれば可能。
get '/list/:page' => sub { my $self = shift; my $page = $self->param('page'); };
また、プレースホルダに初期値を指定したい場合、
get '/list/:page' => {page => 1} => sub {...};
で、/list にアクセスした時に ?page=1 が設定される。
べんりー。
under
認証など各ページ間で共通した処理を記述したい場合に使うもの。
underメソッドを呼び出した移行のルート記述すべてにその設定が適応される。
例えば、
"/"は認証を行わず、"/user"には認証をかけたい場合
# 認証なし get '/' => sub {...} => 'index'; # これ以降のページは認証 under sub { my $self = shift; if ($self->is_login) { $self->redirect_to(...); return; } return 1; } get '/user' => sub {...} => 'index';
また、"/some/add", "/some/list", "/some/edit" などとディレクトリが重なっているのもunderで書ける。
under '/some'; get '/add' => {...}; get '/list' => {...}; get '/edit' => {...};
Controller
Mojolicious::Liteでのルーター(get, post等)で受け取るインスタンスは、Mojolicious::Controller。
$self->renderとかやっているけど、それはControllrメソッドなのです。
僕が主に使いそうなのは以下。
- param
- session
- render
param
Mojolicious::Message::Requestのparamメソッドへのアリアス。だと思っている。
もちろん、$self->req->param も利用可能。取得内容は同じ。
GET/POSTのクエリパラメータへアクセスする。
また、Rooterで指定したパラメータにもこちらでアクセス可能。
session
Cookieによるセッション管理メソッド。
詳しいことは読んでいないが、Plack::Request::Sessionや、HTTP::Sessionなどとはいろいろ違う。
暗号化したセッションデータをクライアントのcookieに格納する。
session_idをcookieに格納し、データ自体はサーバで持つ他のセッション系モジュールとは若干挙動がことなる。
詳しく調べていないので、今後 flashや暗号キーの設定についても調べるべし。
# session set $self->session(user_id => $id); # session get my $user_id = $self->session('user_id'); # session remove $self->session(user_id => undef); # session expire $self->session(expires => 1);