Mojolicious::Lite で作成したアプリを、Mojolicious コントローラにしてみたおはなし

このエントリーをはてなブックマークに追加

この記事は Perl入学式 Advent Calendar 2015 の 6日目の記事です。

というわけで、今回はPerl入学式向けの記事ということで、私 munepom ( @__munepom__ ) がお送りします。
大片付けからの大掃除前半戦が終わりまして。
どうしよう。。。1時間で書けるネタが。。。あ、ありました。

Perl入学式は、2012年に大阪で始まったプログラミング初心者向けの勉強会のようですね。
私は参加してはいないのですが、シャノンでの Perl 研修時、このサイトで学ぶとイイよ!
と教えていただき、過去の教材を漁って勉強し、Perl の基礎を理解することができました。
カリキュラムの内容が全てテキストとして公開されている点が、助かりますね!

そんなPerl入学式のカリキュラムより、2014年の第6回では、
Webアプリケーションフレームワークの1つである、Mojoliciousが紹介されていました。
機能が少ないWebアプリケーションを作るなら、Mojolicious::Liteを利用することで、とりあえず動作する環境が作れますね。
Catalystよりも使い易いフレームワークなのでは?と思っています。

Mojoliciousの詳細については、yuki-kimoto氏のGitHubに日本語訳がまとまっている雰囲気ですので、そちらを参照していただければと思います。

というわけで、今回は、Hello World アプリを Mojolicious::Lite で作成し、それを後で構造化する方法をお届けしまーす!
(当初は、perl-5.22.0 を利用して heroku 上で動作させる話まで書く予定でしたが、また別の話とさせていただきます。。。ヒント:heroku-buildpackとかperlokuを使うと?)

まずは、Mojolicious::Lite で、Hello World アプリを作ってみましょう。ファイル名は、、、myapp.pl とでもしておきますか。

use Mojolicious::Lite;

# Render template "index.html.ep" from the DATA section
get '/' => {template => 'index'};

app->start;
__DATA__

@@ index.html.ep
% my $url = url_for 'title';
<div>I ♥ Mojolicious!</div>
これを、$ morbo myapp.pl で実行すれば、localhost の 3000 番ポートで、サーバが起動しますね。

Mojolicious::Liteの良いところは、直感的なパス指定で、動作とテンプレートの結びつきが見易いところだと思っています。
しかし、規模が大きいWebアプリになってくると、共通ロジックなどは構造化しておかないと、後の負債につながりますよね。。。

では、Mojolicious::Liteで作成したアプリを、Mojolicious Controller ディレクトリ構成で利用できるようにしてみましょう!
基本的には、
・ルーター作って
・対応するコントローラ作って
・アプリ起動スクリプトでは、start_app を実行する
という構成です。
あとは、起動用に引数を組み込んだスクリプトを作成しておくと便利なので、作成しておきます。
とりあえず、以下の4ファイルを作成すれば、Controller っぽくしたアプリが起動できます。

lib/MojoStructureTest.pm

package MojoStructureTest;
use Mojo::Base 'Mojolicious';

sub startup {
  my $self = shift;

  # Router
  my $r = $self->routes;
  $r->any('/')->detour('root#', name => 'Root');
}

1;
lib/MojoStructureTest/Controller/Root.pm
package MojoStructureTest::Controller::Root;
use Mojolicious::Lite;

# Render template "index.html.ep" from the DATA section
get '/' => sub {
    my $c = shift;
    $c->render('index');
};

1;
__DATA__

@@ index.html.ep
% my $url = url_for 'title';
<div>I ♥ Mojolicious!</div>
script/start.pl
#!/usr/bin/env perl

use strict;
use warnings;

use lib 'lib';

# Start command line interface for application
require Mojolicious::Commands;
Mojolicious::Commands->start_app('MojoStructureTest');
Perloku
./script/start.pl daemon -l http://*:$PORT -m mojostructuretest

あとは、$ PORT=3000 ./Perloku を実行すると、localhost の 3000 番ポートで、サーバが起動します。
http://localhost:3000/ へアクセスすると、、、
I ♥ Mojolicious! と表示されます。
(perl-5.22.0 にて、動作確認済みです。)

さて、これで Controller として利用できるようにはなりましたが、__DATA__ セクションにテンプレートがあるのは気持ち悪いですね。
View と Controller 一体型はちょっと。。。ですね。
これらの分離については、今月のどこかで、別の話として記事にしますね。

Enjoy! (・ω・)ノ

次の記事
« Prev Post
前の記事
Next Post »
Related Posts Plugin for WordPress, Blogger...