Perl Hackers Hub

第33回 MojoliciousでかんたんWebアプリケーション開発(2)

この記事を読むのに必要な時間:およそ 3.5 分

前回の(1)こちらから。

MojoliciousとMVC

ここでは(1)で生成したmyapp.plファイルのコードをもとに,多くのWebアプリケーションフレームワークで採用されているMVCModel-View-ControllerアーキテクチャとMojoliciousの対応について解説します。

コントローラ

myapp.plにおいてコントローラに相当するのはリスト1のサブルーチン部分です。

リスト1 ルーティングとコントローラの定義

get '/' => sub {
  my $c = shift;
  $c->render(template => 'index');
};

リクエストとコントローラを紐付けるルーティングの定義の基本的な形式は次のようになります。

HTTP メソッド 'URL パターン' => sub { ... };

get '/'部分で処理すべきリクエストを定義し,リクエストがマッチした場合に実行するサブルーチン(コントローラ)を定義します。リスト1ではHTTPのGETメソッドで/というパターンにマッチするURLにリクエストがきたときに,定義したサブルーチンが実行されます。

Mojoliciousの内部において,ルーティングはMojolicious::Routesが担当し,コントローラはMojolicious::Controllerが担当します。

実行されるサブルーチンの第1引数にはMojolicious::Controllerのインスタンスが渡されます。このインスタンスを利用して,リクエストに含まれるデータの取得やビューの決定などを行います。

Mojolicious::Routesではプレースホルダやネストしたルーティングを活用した認証処理など,より複雑なルーティングも定義できます。詳しくはルーティングガイドを参考にしてください。

ビュー

ビューはMojolicious::Controllerrenderメソッドで呼び出します。myapp.plではリスト1の次の部分です。

$c->render(template => 'index');

Mojolicious 内部において,ビューはMojolicious::Rendererが担当し,デフォルトではMojo::Templateがレンダリングします。このコードではtemplate => 'index'によって,DATAセクションに定義してあるindex.html.epをテンプレートとしてレンダリングしますリスト2)⁠

リスト2 index.html.epテンプレート

@@ index.html.ep
% layout 'default';
% title 'Welcome';
Welcome to the Mojolicious real-time web framework!

テンプレートの命名規則はテンプレート名.フォーマット.ハンドラです。引数による指定がない場合,テンプレート名はコントローラ名/アクション名もしくはルート名フォーマットはhtml,ハンドラはepとなります。myapp.plではコントローラ名やアクション名,ルート名を定義していないので,templateによってテンプレート名を指定しています。

テンプレートではリスト3のようなEmbedded Perlと呼ばれる形式でPerlコードを埋め込むことができます。また,Mojolicious::Plugin::DefaultHelpersMojolicious::Plugin::TagHelpers開発者側で定義したヘルパーを使うことができます。リスト2のテンプレートではMojolicious::Plugin::DefaultHelperslayoutヘルパーとtitleヘルパーを使用しています。

リスト3 Embedded Perl

<% Perl コード %>
<%= Perl コードを評価しXML エスケープして置換 %>
<%== Perl コードを評価して置換 %>
<%# コメント %>
<%% "<%" に置換 %>
% 行単位の"<% Perl コード %>"
%= 行単位の"<%= Perl コード %>"
%== 行単位の"<%== Perl コード %>"
%# コメント行
%% "%" に置換

Mojolicious::RendererではこのほかにもJSONJavaScript Object Notationやバイナリデータのレンダリング,クライアントからのリクエストに応じたレンダリングの切り替え(コンテントネゴシエーション)などができます。詳しくはレンダリングガイドを参考にしてください。

モデル

Mojolicious はモデルをサポートしていません。myapp.plでもモデルに相当する部分はありません。モデルは開発者側で設計して実装する必要があります。

プロトタイプや小規模開発ではコントローラ内部にモデルのロジックを書いてもさほど問題はありませんが,ある程度の規模の開発や拡張性が必要な場合は,コントローラからモデルを分離して実装するのが効果的です。モデルの実装については後述します。

著者プロフィール

hayajo(Hayato Imai)

新潟で働くエンジニア。

仕事ではPerlやGoによるアプリケーション開発やインフラ設計、構築、運用に携わる。

黒い画面が大好き。

コメント

コメントの記入