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にすると名前が表示されない事が分かると思います。
今日はここまで。