PHP on sMash -sMashとPHPで作るRESTful Webアプリケーション- 第10回は、イベント・ハンドラーです。今回も前回同様、V1.1の環境を利用しますので、こちらを参考に開発環境構築を行ってください。それでは、始めて行きましょう。

●概要

イベント・ハンドラーは、イベント・ドリブン・アーキテクチャー(EDA)における重要な概念の一つです。イベント・ドリブン・アーキテクチャーについては、IBMのdeveloperworksの記事、またはGartnerのサイトをご参照下さい。

sMashのコンセプトの1つに、イベント・プロセスがあります。sMashでは、各種の処理をイベントとして定義し、そのイベントに対応するイベント・ハンドラーがその処理を実行する、といったモデルを利用することができます。このイベントの定義として、sMashでは2種類の方法を提供しています。1つは、カスタム・イベントを定義する方法、もう1つは、暗黙的なイベント定義を利用する方法です。暗黙的なイベント定義とは、RESTインターフェース同様、HTTPメソッドを使い分ける形で定義する方法です。今回はこのうち、カスタム・イベントの定義について説明します。

●イベントの定義

まず、イベントの定義を行いましょう。

  1. eclipseを起動し、File > New > Project > WebSphere sMash > WebSphere sMash PHP Applicationと選択し、プロジェクト名を入れ、プロジェクトを作成します。今回は”EventHandler”とします。
  2. 次に、/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”を作成します。

  1. /app/scriptsを右クリックし、New > PHP Filesを選択します。
  2. ファイル名に”myeventhandler.php”と入力し、Finishをクリックします。
  3. “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をご参照下さい。

●イベントの発生方法

最後に、テストを行うため、イベントを発生させるクライアントを作成します。

  1. /publicを右クリックし、New > PHP Filesを選択します。
  2. ファイル名に”fireevent.php”と入力し、Finishをクリックします。
  3. “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文で表示するものです。

これで、一通りのイベントの実行環境が揃いました。早速テストしてみましょう。

●テスト

では、テストを実行してみましょう。

  1. プロジェクトを右クリックし、Run As > WebSphere sMash Applicationを選択し、アプリケーションを起動します。
  2. http://localhost:8080/fireevent.phpにアクセスします。
  3. “foo : bar”と表示されれば成功です。

次回は、暗黙的なイベント定義を利用したイベント・ハンドラーを作成していきましょう。

Leave a Reply

Spam Protection by WP-SpamFree Plugin