前回の(1)はこちらから。
MojoliciousとMVC
ここでは(1)で生成したmyapp.pl
ファイルのコードをもとに、多くのWebアプリケーションフレームワークで採用されているMVC(Model-View-Controller)アーキテクチャとMojoliciousの対応について解説します。
コントローラ
myapp.pl
においてコントローラに相当するのはリスト1のサブルーチン部分です。
リクエストとコントローラを紐付けるルーティングの定義の基本的な形式は次のようになります。
get '/'
部分で処理すべきリクエストを定義し、リクエストがマッチした場合に実行するサブルーチン(コントローラ)を定義します。リスト1ではHTTPのGETメソッドで/
というパターンにマッチするURLにリクエストがきたときに、定義したサブルーチンが実行されます。
Mojoliciousの内部において、ルーティングはMojolicious::Routes
が担当し、コントローラはMojolicious::Controller
が担当します。
実行されるサブルーチンの第1引数にはMojolicious::Controller
のインスタンスが渡されます。このインスタンスを利用して、リクエストに含まれるデータの取得やビューの決定などを行います。
Mojolicious::Routes
ではプレースホルダやネストしたルーティングを活用した認証処理など、より複雑なルーティングも定義できます。詳しくはルーティングガイドを参考にしてください。
ビュー
ビューはMojolicious::Controller
のrender
メソッドで呼び出します。myapp.pl
ではリスト1の次の部分です。
Mojolicious 内部において、ビューはMojolicious::Renderer
が担当し、デフォルトではMojo::Template
がレンダリングします。このコードではtemplate => 'index'
によって、DATAセクションに定義してあるindex.html.ep
をテンプレートとしてレンダリングします(リスト2)。
テンプレートの命名規則はテンプレート名.フォーマット.ハンドラ
です。引数による指定がない場合、テンプレート名はコントローラ名/アクション名
もしくはルート名
、フォーマットはhtml、ハンドラはep
となります。myapp.pl
ではコントローラ名やアクション名、ルート名を定義していないので、template
によってテンプレート名を指定しています。
テンプレートではリスト3のようなEmbedded Perlと呼ばれる形式でPerlコードを埋め込むことができます。また、Mojolicious::Plugin::DefaultHelpers
やMojolicious::Plugin::TagHelpers
、開発者側で定義したヘルパーを使うことができます。リスト2のテンプレートではMojolicious::Plugin::DefaultHelpers
のlayout
ヘルパーとtitle
ヘルパーを使用しています。
Mojolicious::Renderer
ではこのほかにもJSON(JavaScript Object Notation)やバイナリデータのレンダリング、クライアントからのリクエストに応じたレンダリングの切り替え(コンテントネゴシエーション)などができます。詳しくはレンダリングガイドを参考にしてください。
モデル
Mojolicious はモデルをサポートしていません。myapp.pl
でもモデルに相当する部分はありません。モデルは開発者側で設計して実装する必要があります。
プロトタイプや小規模開発ではコントローラ内部にモデルのロジックを書いてもさほど問題はありませんが、ある程度の規模の開発や拡張性が必要な場合は、コントローラからモデルを分離して実装するのが効果的です。モデルの実装については後述します。
MojoliciousによるWebアプリケーション開発
ここでは簡単な掲示板の作成を通して、Mojoliciousアプリケーションの開発を体験してみましょう。
事前に次のコマンドを実行して、アプリケーションのひな型となるファイルを生成してください。
データベースを用意する
今回作成するアプリケーションではデータベースにSQLite3を利用します。各プラットフォームに合わせてインストールしてください。
掲示板のスキーマはリスト4になります。mojo_bbs.sql
ファイルにSQLを保存して、次のコマンドでmojo_bbs.db
を作成してください。
データベースを設定する
続いて、アプリケーションでデータベースを扱えるように設定します。
接続するデータベースの情報は外部ファイルで管理できたほうが取り回しが良いため、mojo_bbs.json
ファイルにJSONフォーマットでリスト5の内容を記述します。
mojo_bbs.pl
にはリスト6の内容を追加します。JSONConfig
プラグインを利用することで、先ほどのmojo_bbs.json
ファイルの内容を参照できます。また、アプリケーションのインスタンスにdbh
という属性を用意し、データベースハンドラを利用できるようにコールバックを定義します。このコールバックは毎回実行されるわけではなく、属性の値が設定されていない場合にのみ実行され、結果が属性に設定されます。
コントローラを実装する
ルーティングとコントローラの実装はリスト7のようになります。コントローラ内部では、先ほど用意した$c->app->dbh
からデータベースハンドラを取得して操作を行います。
get '/comments'
ではテンプレートでも利用できるように、データベースから取得した結果をstash
に渡します。post '/comments'
は少々長いコードですが、コメントの入力があった場合にデータベースに登録し、/comments#id
にリダイレクトしています。
テンプレートを追加する
最後の仕上げにコメントの一覧と投稿フォームを描画するためのテンプレートをDATAセクションに追加します(リスト8)。
一覧表示のためのget '/comments'
にはlist
というルート名を設定してあるので、テンプレート名はlist.html.ep
となります。テンプレートではstash
を通して渡されたデータをもとにコメント一覧をレンダリングします。
動作を確認する
それではアプリケーションを実行してみましょう。前節と同様にmorbo
を使います。今回は実行時に「設定ファイルをロードした」というログが画面に表示されます(図4)。
ブラウザでhttp://127.0.0.1:3000/
にアクセスして、コメントの投稿や一覧の表示などの一通りの動作を確認してみてください。
<続きの(3)はこちら。>