モバゲータウンのノウハウ満載! フレームワークMobaSiFを使おう!
第3回 MobaSiFでのWebアプリケーション実装と内部処理
2008年9月5日
初出:WEB+DB PRESS Vol.45(2008年6月24日発売)
MobaSiFでのWebアプリケーション記述方法
今回は,MobaSiF上で簡単なWebアプリケーションを実装する流れを説明し,その後フレームワークとしての内部処理を説明します。
Webアプリケーションの実装は
- URL,呼び出される.pmファイル,サブルーチンを関連づける
- アプリケーションロジックを.pmファイルに記述する
- テンプレートファイルを記述する
という3ステップで行われます。順に説明します。
URL,.pmファイル,サブルーチンの関連づけ
WebアプリケーションのURLは
http://example.com/_<ページ名>
という形式をとり,たとえば
http://example.com/_echo
のようになります。この場合ページ名は「echo」です。また,この後に“?”を続けて,いわゆるクエリパラメータをつけることも可能です。
http://example.com/_echo?key=value
ページ名とアプリケーションロジックの関連づけはconf/pages.confファイル内の%PAGEというハッシュで行います。このハッシュではリスト1のような形式で記述します。この記述例を1行で示すとリスト2になります。また,それぞれのフィールドをまとめたのが表1です。
リスト1 %PAGEでページ名とアプリケーションロジックを関連づける
our %PAGE = (
'ページ名1' => [ UID_ST, USER_ST, SERV_ST, MODULE, SUB ],
'ページ名2' => [ UID_ST, USER_ST, SERV_ST, MODULE, SUB ],
)
リスト2 リスト1の記述例
'echo' => [ 0,0,2, 'Page::Echo', 'pageMain' ],
表1 %PAGE各フィールドの設定内容
| UID_ST | 端末認証要求(端末IDは,NTTドコモのutnまたはiモードID,auのEZ番号,ソフトバンクモバイルのUIDのいずれか) |
|---|---|
| 0 | 端末ID通知なしでOK |
| 1 | 端末ID必須 |
| USER_ST | 要求する会員登録状態 |
| 0 | 非会員 |
| 1 | 会員登録済(メルアド未認証) |
| 2 | 会員登録済(メルアド認証済) |
| SERV_ST | 操作に対する制限状態(以下を足したもので表現) |
| 0 | すべての操作を可能 |
| 1 | 自主退会では操作不可 |
| 2 | オペレータより退会処理されている場合不可 |
| 4 | ペナルティ状態だと不可 |
| 8 | メール不達だと操作不可 |
| MODULE | 呼び出すPerlモジュール名 |
| SUB | MODULE内で呼び出すサブルーチン名 |
アプリケーションロジックを記述する
conf/pages.confファイルにページを追加したあとは,関連したアプリケーションロジックをpm/Pageディレクトリ以下の.pmファイルに記述します。例として,ユーザがフォームに入力した値を画面に表示するだけのアプリケーションロジックを見ていきましょう(リスト3)。conf/pages.confで指定したサブルーチンには,ハッシュのキーとなっているページ名が引数として渡されます(11行目)。ユーザがFormに入力した値は$_::Fに入ってきますので,そのうちキーが小文字から始まるものに絞って$rhDataというハッシュリファレンスにコピーし(12行目),"echo"というテンプレートに引き渡しています(14行目)。最後にテンプレートエンジンの処理結果をブラウザに出力します(15行目)。
今回は,このファイルをpm/Page/Echo.pmとして保存します。
リスト3 フォームに入力した値を画面に表示させる
01: package Page::Echo;
02:
03: use strict;
04: use MobaConf;
05: use Common;
06: use DA;
07: use HTMLTemplate;
08: use Response;
09:
10: sub pageMain {
11: my $func = shift;
12: my $rhData = Common::cloneHash($_::F, '^[a-z]');
13:
14: my $html = HTMLTemplate::insert("echo", $rhData);
15: Response::output(¥$html);
16: }
17: 1;
テンプレートファイルを記述する
テンプレートファイルの記述方法の詳細は後述しますが,リスト3の14行目で指定している"echo"はtemplate/_system/echo.htmlファイルに対応しますので,この位置にテンプレートファイルを置きます。中身をリスト4に示します。
リスト4 テンプレートファイルの例
01: <html>
02: <head>
03: <title>echo</title>
04: </head>
05: <body>
06:
07: <form action="_echo" method="POST">
08: <input type="text" name="message"><input type="submit">
09: </form>
10:
11: $if (message) { $ $=h:message$ $ } $
12: </body>
13: </html>
リスト4の11行目では,リスト3の14行目でMTemplate::insert( )に渡されているハッシュリファレンス$rhDataについて,$rhData->{message}がセットされていればそれが入力フォームの下に表示されるという内容になっています。
テンプレートファイルが用意できたあとは,script/tools/compile_templateを実行して,バイナリテンプレートを出力します。その後Apacheを再起動すると,
http://example.com/_echo
でこの画面が表示され,このアプリケーションロジックの動作を確認できます。
ディスパッチャの内部処理
ところで,HTTPリクエストのURLがconf/pages.confに基づいて解釈され,指定された.pmファイルのサブルーチンを呼び出すまでの内部処理はどうなっているでしょうか。この部分はディスパッチャと呼ばれ,MVCコントローラのシンプルな実装ともいえます。内部処理に興味がない場合は飛ばしていただいてかまいませんが,MobaSiFのシンプルで処理を追いやすいという特徴を示す部分でもあり,ほかのモジュールとの関連を示す部分にもなっていますので参考にしてください。
- ApacheへのHTTPリクエストはconf/rewrite.conf(リスト5)のRewriteRuleとconf/httpd.confのFastCGIに関する設定により,fcgi/index.fcgiに渡される。また,URL中の<ページ名>部分は,RewriteRuleによりfというリクエストパラメータに渡される。
- fcgi/index.fcgiはpm/Page/Main.pmのmain( )サブルーチンを呼び出す。このサブルーチンの中では
- ケータイキャリアや端末の判別,端末認証に必要なHTTPリクエストヘッダなどの処理(pm/MobileEnv.pm)
- HTTPリクエストパラメータの共通処理を行い,$_::Fにセット(pm/Request.pm)
- 端末認証に基づいたユーザ情報を取得し,$_::Uにセット
- conf/pages.confに基づき,URL中の<ページ名>に対応するモジュールとサブルーチンの呼び出し
リスト5 conf/rewrite.conf
RewriteEngine On
RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS)
RewriteRule .* - [F]
RewriteRule ^/¥.([^/]+)/(.*)$ /$2?_u=$1 [QSA]
RewriteRule ^/_([^/¥.]+)(¥.html?)?$ /?f=$1 [QSA]
RewriteRule ^/static/(.*)$ /static/$1 [QSA,PT,L]
RewriteRule ^/$ /fcgi/index.fcgi [QSA,PT,L]
RewriteRule ^/(.*¥.html)$ /fcgi/index.fcgi?f=page&page=$1 [QSA,PT,L]
RewriteRule ^/(.*¥/)$ /fcgi/index.fcgi?f=page&page=$1 [QSA,PT,L]
こう追ってみると,実にシンプルな処理になっていることがおわかりいただけるのではないでしょうか。
次回は,MobaSiFに含まれている個々のPerlモジュールについて解説します。

