Mojolicious::LiteでWebフレームワークを試す [その3]

前々回前回の続き。

今日はテンプレートとflash/stashの勉強。

テンプレート

MVCモデルのVに当たると思いますが、表示部分のテンプレートはEmbedded Perl(EP)と呼ばれる記法(?)で記載するようです。
基本的にはHTMLと同様なのですが文中にPerlコードを組み込むことができます。
ドキュメントにはいろいろ書いてあるのですが、以下自分が使いそうなものから。

%# これはコメント行になります。
<%# これもコメント行になります(タグ記法) %>
% Perlのコードを記載します。
<% タグで括っても書けます %>
%= ここには式を使った実際の結果を入れることができるようです。XSSを防ぐためにデフォルトで <, >, &, ", 'はエスケープされ、セミコロンは自動で挿入されるようです。
<%= %>これも上と同じ。

コードから値を渡すこともできます。

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

__DATA__
@@ index.html.ep
<%= $message %>

またArrayRefなども同様に渡すことができます。

get '/' => sub {
    my $self = shift;
    my $list = [
        { version => 'beta', name => 'Siam' },
        { version => '10.0', name => 'Cheetah' },
        { version => '10.1', name => 'Puma' },
        { version => '10.2', name => 'Jaguar' },
        { version => '10.3', name => 'Panther' },
        { version => '10.4', name => 'Tiger' },
        { version => '10.5', name => 'Leopard' },
        { version => '10.6', name => 'Snow Leopard' },
        { version => '10.7', name => 'Lion' },
    ];

    $self->render( osx_list => $list );
} => 'index';

app->start;

__DATA__
@@ index.html.ep
<dl>
<% foreach my $osx (@$osx_list) { %>
    <dt><%= $osx->{version} %></dt>
    <dd><%= $osx->{name} %></dd>
<% } %>
</dl>

他にも継承(extends)やブロック( begin ~ end )などもありますがここでは省略。

session

セッションを持ちまわす方法は$self->sessionを使用します。
使用方法は

get '/' => sub {
    my $self = shift;
    $self->session(name => 'MojoRocks');
    $self->render;
} => 'index';

等と書くと設定でき、参照は

get '/foo' => sub {
    my $self = shift;
    my $name = $self->session('name');
    :

やrenderでは

<%= session 'name' %>
<%# あるいは %>
<% my $name = session 'name' %>

などで取得できます。

stashとflash

データの格納方法にはstashとflashの2つが存在します。

stash

まずstashは現在のリクエストで利用する値を保存するために使われます。
つまり、

get '/' => sub {
    my $self = shift;
    $self->stash( yourname => 'Sebastian' );
    $self->render;
} => 'index';

app->start;
__DATA__
@@ index.html.ep
Hello, <%= stash 'yourname' %>!

と書くことでViewにデータを渡すことができます。
ただし、データの有効範囲は"現在の"リクエストに限定されます。

flash

flashはリダイレクト先に渡すような"次のリクエスト"で使用するデータのために使用されます。

get '/hi' => 'hi';
get '/' => sub {
    my $self = shift;
    $self->flash(name => 'Sebastian');
    $self->redirect_to('hi');
} => 'index';
app->start;

__DATA__
@@ hi.html.ep
<h1>Hi,<%= flash 'name' %>!</h1>

たとえばこのように書くと、"Hi, Sebastian!"と表示されます。
このコードのflashの箇所をstashにすると名前が表示されない事が分かると思います。

今日はここまで。