(1)はこちら、(2)はこちらから。
Mojoliciousによる開発の勘所
ここからはMojoliciousを利用したWebアプリケーション開発におけるポイントを解説します。
解説する内容を反映したサンプルコード(mojo_wiki
)を本誌サポートサイトに用意しましたので、参考にしてください。
MojoliciousとMojolicious::Lite
(2)までに作成したmyapp.pl
や掲示板アプリケーションは、Mojoliciousに含まれるマイクロWebフレームワークMojolicious::Lite
を利用したアプリケーションです。ルーティング、コントローラ、ビューのテンプレートすべてを1つのファイルに定義できるので、CGIスクリプトのような感覚で気軽に開発できます。
ですが、アプリケーションが成長して規模が大きくなってきたり拡張性やメンテナンス性が必要になってくると、Mojolicious::Lite
では荷が重くなってきます。このような場合には通常のMojoliciousアプリケーションとして開発を行うことをお勧めします。
Mojoliciousアプリケーションは(2)と同様にmojogenerate
で生成できますが、コマンドの引数はlite_app
ではなくapp
となります。
コマンドが完了すると、my_app
ディレクトリ配下に図5のディレクトリ構造が生成されます。各コンポーネントごとにファイルが分割されるので、Mojolicious::Liteのアプリケーションに比べて保守性、拡張性の高い開発ができます。
プロトタイピングでMojolicious::Liteアプリケーションを作成し、そのあとにMojoliciousアプリケーションへ移行して開発を継続することもできます。移行ガイドを参考にしてください。
モデルの実装
前述したとおり、Mojoliciousはモデルをサポートしていません。
前節の掲示板アプリケーションの場合は特にほかのインタフェース(コマンドラインツールやテストなど)での処理を必要としなかったため、コントローラにアプリケーションロジックを実装しました。ですが、多くのWebアプリケーションではコントローラ以外のインタフェースでもアプリケーションロジックが必要となることがあるため、アプリケーションロジックをモデルに格納し、コントローラから切り離して実装するのが効果的です。
リスト9は、O/RマッパのTeng
を利用したモデルの実装例です。
このモデルを各インタフェースで直接扱ってもよいのですが、SQLによるデータベース操作を抽象化するまでの実装となっているため、それぞれのインタフェースでアプリケーションロジックを少なからず実装しなければなりません。そこでこのモデルを内部的に利用する、次のようなモデルを作成します。
このように実装することでコントローラからアプリケーションロジックを分離し、次のようにほかのイン
タフェースでもモデルを利用できます。
パラメータのバリデーション
MojoliciousではパラメータのバリデーションにMojolicious::Validator::Validation
を利用できます。
コントローラのvalidation
メソッドでインスタンスを取得でき、リクエストパラメータに対してrequired
やoptional
などの各種制約を指定します。
テンプレートではMojolicious::Plugin::TagHelpers
の各種フィールドを使用することで、エラー時の値の復元やfield-with-error
クラスの付与を自動的に行ってくれます。
また、Mojolicious::Plugin::TagHelpers
のcsrf_field
と組み合わせることでCSRF(Cross-Site Request Forgeries)対策もできます。データの更新を行うような場面では積極的に利用することをお勧めします。
ユーザ定義の制約はMojolicious::Validator
のadd_check
メソッドで追加します。筆者はモデルでもMojolicious::Validator
を利用するため、これを継承したリスト10のようなValidatorを作成し、次のコードをモデルに追加しています。
Mojoliciousアプリケーションではvalidator
メソッドでモデルのValidatorインスタンスを登録します。こうすることでモデルとコントローラで共通の制約を扱えます。
アプリケーションのテスト
Mojoliciousアプリケーションは標準でサーバを通さずにリクエストを送るget
コマンドが利用できます。開発中の簡単な動作確認に重宝します。
本格的なテストにはMojo::Test
というテスト用のモジュールを利用します。レスポンスヘッダの内容やCSSセレクタ、JSON Pointerを使用したデータの確認、WebSocketによるデータの送受信など、実際にブラウザでアクセスしたようなテストができます。リスト11はMojo::Test
を利用したテストコードの一部です。
テストの実行にはMojoliciousアプリケーションのtest
コマンドを使います。Test::Harness
に付属するprove
コマンドでも実行できます。
アプリケーションのデプロイ
Mojoliciousアプリケーションはさまざまな方法でデプロイできます。代表的なデプロイ方法を解説します。
ビルトインWebサーバ
Mojoliciousアプリケーションは標準でHTTPとWebSocketをサポートしたWebサーバ機能が組み込まれます。
daemon
コマンドではシングルプロセスのWebサーバ、prefork
コマンドではプリフォーク型のWebサーバでアプリケーションを実行できます。開発用途やアプリケーション配布後の実行コマンドとして利用します。
Morbo、Hypnotoad
Mojoliciousをインストールすると、mojo
コマンドのほかにmorbo
とhypnotoad
コマンドもインストールされます。
morbo
はアプリケーションのdaemon
コマンドと同じくシングルプロセスのアプリケーションサーバですが、プロジェクトのファイル変更を検知して自動でプロセスを入れ替えます。開発用のサーバとして利用します。
hypnotoad
はアプリケーションのprefork
コマンドと同じくプリフォーク型のアプリケーションサーバです。ホットデプロイをサポートし、無停止でアプリケーションのアップグレードができます。本番環境での利用にお勧めです。
ビルトインWebサーバやmorbo
がコマンドラインオプションで動作を設定するのに対して、hypnotoad
ではMojoliciousアプリケーションのconfig
で動作を設定します。Mojolicious::Plugin::Config
やMojolicuous::Plugin::JSONConfig
でも同様に設定できます。
PSGI、CGI
Mojolicious はPSGI(Perl Web Server Gateway Interface)に対応しています。plackup
などのPSGIをサポートしたコマンドにスクリプトのパスを渡すだけで、PSGIアプリケーションとして実行できます。
またCGIにも対応しており、そのままでCGIスクリプトとして実行できます。
まとめ
駆け足になりましたが、Mojoliciousの概要と開発するうえでの勘所を解説しました。
Mojoliciousは、本稿では解説できなかった非同期I/Oやプラグインなど、高度なWebアプリケーション開発のための機能も充実しています。ぜひとも手元で動かして、その豊富な機能を堪能してみてください。
さて、次回の執筆者は坪内佑樹さんで、テーマは「DockerによるPerlのWebアプリケーション開発」です。お楽しみに。