PHP on sMash – 第10回 イベント・ハンドラー (カスタム・イベント)
Posted by Kenta Takahashi on 1月 30th, 2009. Other posts by Kenta Takahashi
PHP on sMash -sMashとPHPで作るRESTful Webアプリケーション- 第10回は、イベント・ハンドラーです。今回も前回同様、V1.1の環境を利用しますので、こちらを参考に開発環境構築を行ってください。それでは、始めて行きましょう。
●概要
イベント・ハンドラーは、イベント・ドリブン・アーキテクチャー(EDA)における重要な概念の一つです。イベント・ドリブン・アーキテクチャーについては、IBMのdeveloperworksの記事、またはGartnerのサイトをご参照下さい。
sMashのコンセプトの1つに、イベント・プロセスがあります。sMashでは、各種の処理をイベントとして定義し、そのイベントに対応するイベント・ハンドラーがその処理を実行する、といったモデルを利用することができます。このイベントの定義として、sMashでは2種類の方法を提供しています。1つは、カスタム・イベントを定義する方法、もう1つは、暗黙的なイベント定義を利用する方法です。暗黙的なイベント定義とは、RESTインターフェース同様、HTTPメソッドを使い分ける形で定義する方法です。今回はこのうち、カスタム・イベントの定義について説明します。
●イベントの定義
まず、イベントの定義を行いましょう。
- eclipseを起動し、File > New > Project > WebSphere sMash > WebSphere sMash PHP Applicationと選択し、プロジェクト名を入れ、プロジェクトを作成します。今回は”EventHandler”とします。
- 次に、/config/zero.configを開き、以下の内容を追加します。
/config/handlers += [{
"events" : "myevent",
"handler" : "myeventhandler.php"
}]
この定義は、”myeventhandler.php”で処理する、”myevent”というイベント、という意味になっています。このように、イベントの定義はzero.configに記述します。記述フォーマットは、以下のようになっています。
/config/handlers += [{
"events" : JSON_string or JSON_array(JSON_string),
"handler" : JSON_string,
"conditions" : JSON_string,
"instanceData" : JSON_object
}]
必須項目は、以下の2つです。
- events : イベント名
- handler : そのイベントを処理するイベントハンドラーの名前
これで、”myevent”というイベントが定義されました。”myevent”が発生した場合、自動的に”myeventhandler.php”が実行されます。他のパラメータなどのイベント定義の記述方法の詳細については、Deverloper’s Guide : Configをご参照下さい。
●イベント・ハンドラーの実装
次に、”myevent”の定義に記述したイベント・ハンドラー、”myeventhandler.php”を作成します。
- /app/scriptsを右クリックし、New > PHP Filesを選択します。
- ファイル名に”myeventhandler.php”と入力し、Finishをクリックします。
- “myeventhandler.php”に、以下のコードをコピー&ペーストします。
<?php
// Event Handler for "myevent" stored in app/scripts/myeventhandler.php
$arr = array('foo' => 'bar');
zput('/request/somekey', $arr);
?>
これで、先ほど定義したイベントを処理するイベント・ハンドラーが作成されました。このイベント・ハンドラーは、グローバル・コンテキストの/request/somekeyに、”foo”:”bar”が入った配列を格納します。
イベント・ハンドラーはPHPのクラスとして書くことも可能です。この場合、ファイル名とクラス名は同一である必要があります。コンストラクタがある場合は、引数を持たないコンストラクタが呼ばれます。また、別のファイルをincludeする場合は、ファイルの先頭でincludeします。
<?php
// Event Handler for "myevent" stored in app/scripts/myeventhandler.php
include "my_include.php"; //outer scope code is executed first
class myeventhadler {
function __construct() {
// Constructor with no arguments will be called
echo "sMash:";
}
function onMyEvent() {
$arr = array('foo' => 'bar');
zput('/request/somekey', $arr);
}
}
?>
これらのイベント・ハンドラーは、GroovyやPHPスクリプトの場合、/app/scriptsに配置します。.gtなどのテンプレートであれば、/app/viewsに配置します。カスタム・イベント・ハンドラーの記述方法の詳細については、Deverloper’s Guide : Writing PHP handlersをご参照下さい。
●イベントの発生方法
最後に、テストを行うため、イベントを発生させるクライアントを作成します。
- /publicを右クリックし、New > PHP Filesを選択します。
- ファイル名に”fireevent.php”と入力し、Finishをクリックします。
- “fireevent.php”に、以下のコードをコピー&ペーストします。
<?php
$eventctxt = array('otherctxt' => 'foobar');
fire_event('myevent', $eventctxt);
$arr = zget('/request/somekey');
zput('/request/headers/out/Content-Type', 'text/plain');
foreach($arr as $key => $value) {
echo " $key : $value";
}
?>
ここに示したとおり、PHPにおいてカスタム・イベントを発生させるためには、fire_event()関数を実行します。 このスクリプトは、イベント”myevent”を発生させ、イベント・ハンドラーの処理として格納された配列を/request/somekeyから取得し、それをforeach文で表示するものです。
これで、一通りのイベントの実行環境が揃いました。早速テストしてみましょう。
●テスト
では、テストを実行してみましょう。
- プロジェクトを右クリックし、Run As > WebSphere sMash Applicationを選択し、アプリケーションを起動します。
- http://localhost:8080/fireevent.phpにアクセスします。
- “foo : bar”と表示されれば成功です。
次回は、暗黙的なイベント定義を利用したイベント・ハンドラーを作成していきましょう。

Leave a Reply