モバゲータウンのノウハウ満載! フレームワークMobaSiFを使おう!

第3回MobaSiFでのWebアプリケーション実装と内部処理

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モジュール名
SUBMODULE内で呼び出すサブルーチン名

アプリケーションロジックを記述する

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のシンプルで処理を追いやすいという特徴を示す部分でもあり、ほかのモジュールとの関連を示す部分にもなっていますので参考にしてください。

  1. ApacheへのHTTPリクエストはconf/rewrite.confリスト5のRewriteRuleとconf/httpd.confのFastCGIに関する設定により、fcgi/index.fcgiに渡される。また、URL中の<ページ名>部分は、RewriteRuleによりfというリクエストパラメータに渡される。
  2. 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モジュールについて解説します。

おすすめ記事

記事・ニュース一覧