Perl入学式 #6
Perl入学式 #6
- YAPC::Asia2013で初参加してからはや半年。
- とうとう、WAFつかって一行掲示板を作るところまで引き上げてもらった。
Mojolicious::Lite
- ゆーすけべーさんの本で、知ってはいた。
- あと、YAPC::Asia2013のPerl入学式でもちょっと触ったような。
- でもそれっきりだったので、いざやってみるときれいに忘れてる。
- 資料
- Mojoliciousに同梱されているWebサーバ「Morbo」もーぼ?もるぼ?
いざ復習
準備
- コンソールから
mojo generate lite_app アプリ名
でひな形作成- 今回は
mojo generate lite_app hello
- 今回は
- morbo hello でwebサーバが実行される
- ブラウザで
http://localhost:3000
へアクセスすると、「Welcome to the Mojolicious real-time web framework! 」と表示されたページが。
- ブラウザで
- ここまで簡単だけど、これ、いざ、Apacheいれて、ディレクティブとかconfファイルいじって云々とか考えたら凄い楽だよなぁ。
- すぐに試せて結果が出るって素敵
コードをいじる
get '/' sub ={}
の部分ってのはMVCで言うところのControllerに当たるのだろう・・・なぁ?(自信ない)self->stash()
にいれたハッシュで値をViewに渡す。- ハッシュなのでvalueとして配列やハッシュを渡す場合にはリファレンスでいれてあげる必要がある
- epはembedded perlの略
- ひな形のep部にある
<head><title><%= title %></title></head>
は
<head><title><%= $title %></title></head>
の方が個人的にわかりやすいなぁとか。
Mojoliciousでfizzbuzzを表示
昨日はテンプレートのところにfizzbuzzのfor文をかいたけど、これはよろしくないとのこと。
- デザイナーさんと分業するときなんかに、彼らの領域にあまり入り込まないため、というような
- 表示を司るViewにプログラムが入り混むのは良くない、と。なるほど納得。
fizzbuzzをController部に書いてみる
- fizzbuzzの結果を配列に格納
- 格納した配列のリファレンスをstashに入れる
- Viewに当たるテンプレートのところで配列から取り出して表示させる
my @fizzbuzz; get '/fizzbuzz' => sub { my $self = shift; for my $i ( 1 .. 100 ) { if ( $i % 15 == 0 ) { push @fizzbuzz, 'fizzbuzz' ; } elsif ( $i % 3 == 0 ) { push @fizzbuzz, 'fizz'; } elsif ( $i % 5 == 0 ) { push @fizzbuzz, 'buzz'; } else { push @fizzbuzz, $i; } } $self->stash( title => 'fizzbuzz', number => \@fizzbuzz ); $self->render('fizzbuzz'); }; @@ fizzbuzz.html.ep <!DOCTYPE html> <html> <head><title><%= $title %></title></head> <body> <h1><%= $title %></h1> % for my $i (@$number){ <%= $i %><br> % } </body> </html>
- リファレンス・デリファレンスが苦手なら、無名配列って方法でも。
my $fizzbuzz2; get '/fizzbuzz2' => sub { my $self = shift; for my $i ( 1 .. 100 ) { if ( $i % 15 == 0 ) { push @$fizzbuzz2, 'fizzbuzz'; } elsif ( $i % 3 == 0 ) { push @$fizzbuzz2, 'fizz'; } elsif ( $i % 5 == 0 ) { push @$fizzbuzz2, 'buzz'; } else { push @$fizzbuzz2, $i; } } $self->stash( title => 'fizzbuzz', number => $fizzbuzz2 ); $self->render('fizzbuzz2'); }; @ fizzbuzz2.html.ep <!DOCTYPE html> <html> <head><title><%= $title %></title></head> <body> <h1><%= $title %></h1> % for my $i (@$number){ <%= $i %><br> % } </body> </html>
気付いたところ
- 行末の ; 忘れとか、変数名の衝突が起き照る場合は、延々と読み込み中のままになってしまったりする
- 別の部分のControllerがおかしいと、ほかのページも表示できなくなったりする
- やっぱり復習大事
簡易掲示板
- 昨日の講義中はちょっと駆け足でわからなかったので自分でじっくりと。
- Viewの中のフォームからpostで受け取るときは
$self->param(ラベル名)
- Viewに値を渡すには
$self->stash(ハッシュ)
- できたー!
- メールアドレス欄にageと入れると、投稿したものが最上位に
- 投稿順に番号を振る
- 投稿日時も記録・表示
- もう少しいじれば2chっぽくなりそう
#!/usr/bin/env perl use Mojolicious::Lite; use Time::Piece; # Documentation browser under "/perldoc" my $entry; get '/' => sub { my $self = shift; $self->stash( body => $entry ); $self->render('index'); }; post '/post' => sub { my $self = shift; my $post_time = localtime; if ( $self->param('mail') eq 'age' ) { unshift @$entry, { name => $self->param('name'), mail => $self->param('mail'), body => $self->param('body'), time => $post_time->datetime, }; } else { push @$entry, { name => $self->param('name'), mail => $self->param('mail'), body => $self->param('body'), time => $post_time->datetime, }; } $self->stash( body => $entry ); $self->redirect_to('/'); }; app->start; __DATA__ @@ index.html.ep % layout 'default'; % title '入力フォーム'; %= form_for '/post' => method => 'POST' => begin name:<%= text_field 'name' %> mail:<%= text_field 'mail' %> body:<%= text_field 'body' %> <%= submit_button '投稿する' %> %= end <p> % my $num = 0; % for my $i (@$body){ % $num++; <%= $num %> name:<%= $i->{name} %> mail:<%= $i->{mail} %> time:<%= $i->{time} %> body:<%= $i->{body} %><br> % } </p> @@ layouts/default.html.ep <!DOCTYPE html> <html> <head><title><%= title %></title></head> <body> <%= content %> </body> </html>