perl Mojolicious:6 perl

PerlのWeb Application Frameworkである Mojolicious でアプリをつくる場合に必要な基礎的な使用法を紹介します。1枚スクリプトから書けるMojolicious::Liteを前提としていますが大きなモノにも対応出来ます。



インストールする

cpanm コマンドでコアモジュール以外の依存関係無しで一発。

$ cpanm Mojolicious

雛形をつくる

Mojoliciousディストリビューションに同封されている mojo コマンドを使ってアプリの雛形をつくりましょう。

$ mojo generate lite_app myapp.pl

立ち上げてみる

myapp.pl 自身が実行可能なスクリプトになっているので

$ ./myapp.pl daemon

とすることで実行したホストの3000番ポートでアプリが立ち上がります。その他 plackupで立ち上げる方法など があります。
ルーティング
GET/POSTのメソッドで振り分ける

Mojolicious::LiteだとDSLが提供されるのでその中の getメソッド と postメソッド 使いましょう。他にもPUTやDELETEもサポートされているのですが、まー最初はget/post知っとけばいいでしょう。

get /entry => sub {
my $self = shift;
# ちなみに $self はMojolicious::Controllerを継承したインスタンス
...;
};

post /entry => sub {
my $self = shift;
...;
};

URLの一部をキャプチャする - path の placeholder

/entry/1 とか /entry/2 とか /entry/3 とかURLの一部、この場合だと /entry/{数字の部分} をキャプチャしてコントローラの中で使いたい時はこのようにします。

get /entry/:id => [ id => qr/¥d+/ ] => sub {
my $self = shift;
my $id = $self->stash->{id};
$self->render( text => Entry ID is $id! );
};

ちなみに $self->stash を使わずに $self->param(“id”) でも可能。
コントローラ
リクエストパラメータ値を取得する

$self->req->param もしくはショートカットである $self->param を使います。

post /entry => sub {
my $self = shift;
my $body = $self->req->param( body );
...;
};

デバグ用のログを出力する

logディレクトリ があればそこにファイル出力、無ければ立ち上げているサーバの標準出力に印字されます。また debug ログだけではなくエラーログなどログレベルを指定することが出来て MOJO_MODE の環境変数等に決まるモードによってどのレベルのログが出力されるかが制御されます。

get / => sub {
my $self = shift;
$self->app->log->debug( This is debug log! );
...;
};

テンプレートをレンダリングする

後ほど説明するテンプレートファイルに値を渡しつつレンダリングする方法です。

get / => sub {
my $self = shift;
my $self->stash->{message} = Hello Mojolicious ;
$self->render( index );
};

$self->stash にデータ構造を入れるとそれがそのままテンプレートで変数化します。また renderメソッド で対象のテンプレートファイルを指定します。
JSONを出力する

先ほどの render メソッドの呼び方をちょいと変えて、ハッシュリファレンスや配列リファレンスなどを与えます。

get /json => sub {
my $self = shift;
my $result = { status => OK message => I am Fine! };
$self->render( json => { result => $result } );
};

リダレイクトさせる

redirect_to メソッドを使います。パスだけ書いて同じアプリケーション内へ、http:// からはじめてフルでURLを書くと外部サイトへ飛びます。

get /dummy => sub {
$self = shift;
$self->redirect_to( / );
};

テンプレート
変数の展開

Perl-rish、つまり、Perlがそのまま書けてしまうMojo::Templateに習います。コントローラから渡ってきた変数の展開は基本このように書きます。

<p> Message : <%= &#36;message %></p>

<%= &#36;value %> とすることで自動的にエスケープが走ります。どうしてもエスケープさせたくない場合は <%== &#36;value %> を使いますがあんま機会はないでしょう。ちなみに今回「変数」と言ってますがオブジェクトをstashで渡してそのメソッドもそのまま実行出来ます。
ループ

Perlがそのまま書けるので for文で回しちゃいます。entries に配列リファレンスが入っているとして

<ul>
% for my &#36;entry (@&#36;entries) &#123;
<li><%= &#36;entry->&#123;title&#125; %></li>
% &#125;
</ul>

でイケますね。
レイアウトの適応

テンプレート内でlayoutメソッドやcontentメソッドを利用するとヘッダーやフッターを含んだ「外枠」と「コンテンツ」を分けて記述することになります。

@@ layouts/default.html.ep
<html><body>
<div id=“content”>
<%= content %>
</div>
</body></html>

@@ index.html.ep
% layout ‘default’;

<p>This is content section!</p>

その他
セッションを使う

Mojoliciousデフォルトのセッションを使う場合は必ず app->secret() メソッドでアプリケーション独自の秘密のパスワードみたいなのを設定してから使いましょう。

use Mojolicious::Lite;

app->secret( secret_password );

get / => sub &#123;
my &#36;self = shift;
&#36;self->session->&#123;count&#125;++;
&#36;self->render( index );
&#125;;

app->start();
__DATA__

@@ index.html.ep
Count: <%= session count %>

User-Agent名を取得する

リクエストオブジェクトが &#36;self->req で取れるのでそこから辿ります。

get ua => sub &#123;
my &#36;self = shift;
my &#36;ua = &#36;self->req->headers->user_agent;
&#36;self->stash->&#123;ua&#125;;
&#36;self->render();
&#125;;



Mojolicious::Lite - search.cpan.org
Mojolicious::Lite - Real-time micro web framework - metacpan.org - Perl programming language