2011年12月8日木曜日

PHPでイベント駆動(event driven)って何だろう?

PHPのPradoというフレームワークがイベント駆動で、すごいらしい。
で、イベント駆動って何だろう?と思って、ちょっと調べてみた。

オブザーバーパターン

イベント駆動というと、jQueryを使って、あるDOM要素にクリックしたら~~する、というのが、まさによい例だそうです。
$( '#button' ).click( function() { alert( 'hi' );});

が、一般的にオブザーバーパターンというらしい。

しかし、イベント駆動のPHPフレームワークと言われても、サーバー側でどうイベントを利用するのかぴんと来ません。

こういうときは、自分で書いてみる。


Stackoverflowで見つけた「Event-driven architecture and hooks in PHP」を参考に、自分で書いてみました。

イベント駆動というよりは、「dumb hook」あるいは「単なるdispatcher」と書いてあるように、非常に簡単なものです。

ともかく、

eventHookというクラス(github)が出来ました。。

最初にイベント名に対して実行する関数(クロージャーでも何でも)を登録します。
eventHook::hook( 'some_event', 
  function() {  echo 'do something'; });
イベント発行は、イベントメソードを叩きます。
eventHook::event( 'some_event' );
簡単だなぁ。

でも、イベント実行時に必要な情報はどうやって渡すんだろう?

そのとき、例に挙げられてた通信バッファーを思い出した。
通信を受け取ると、(OSが?)受け取った内容をメモリ上のバッファーに書き込み始めます。オブザーバーはバッファーを監視していて、バッファーの状態が変わるとイベントを発行、関連付けられてた何かを実行します。当然バッファーに必要な情報が入っている「はず」です。

つまりイベントとは観察している対象が変わることであり、対象自体に情報があるはずです。

eventHookクラスの場合は、eventメソードのイベント名はあくまでバッファーの場所(の代わり)であり、バッファー内の情報はeventメソードと一緒に渡せばいいわけです。
説明すると難しいですが、コードにすると簡単。
eventHook::hook( 'more_event', 
  function( $arg1=NULL, $args=NULL ) {
    echo "doSomething: '$arg1', '$args'\n";
});
eventHook::event( 'more_event', 'arg#1', 'arg#2' );
// 出力:doSomething: 'arg#1', 'arg#2'
単にeventメソードに必要そうなデータを渡せば、実行関数にも同じものを渡します。
うん?実行関数で生成された何か(プライマリキーとか)受け取りたい場合はどうするんだろう?別のイベントを発行してもらうのかな???やばそうな匂いがするなぁ。

で、イベント駆動って何?

未だに肝心の「イベント駆動」がよく分かりません。
多分、イベントを連続して発行することでフレームワークの動きを実装しているのでしょう。MVCの代わりみたいなイメージなのかな。

そういえばワードプレスにもフックがたくさんあると聞いたことが・・・
あぁ、こういうことか。

先は長いなぁ。

0 件のコメント: