で、イベント駆動って何だろう?と思って、ちょっと調べてみた。
◆オブザーバーパターン
イベント駆動というと、jQueryを使って、あるDOM要素にクリックしたら~~する、というのが、まさによい例だそうです。
が、一般的にオブザーバーパターンというらしい。
しかし、イベント駆動のPHPフレームワークと言われても、サーバー側でどうイベントを利用するのかぴんと来ません。
◆こういうときは、自分で書いてみる。
Stackoverflowで見つけた「Event-driven architecture and hooks in PHP」を参考に、自分で書いてみました。
イベント駆動というよりは、「dumb hook」あるいは「単なるdispatcher」と書いてあるように、非常に簡単なものです。
ともかく、
◆eventHookというクラス(github)が出来ました。。
最初にイベント名に対して実行する関数(クロージャーでも何でも)を登録します。
でも、イベント実行時に必要な情報はどうやって渡すんだろう?
そのとき、例に挙げられてた通信バッファーを思い出した。
イベント駆動というと、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の代わりみたいなイメージなのかな。
そういえばワードプレスにもフックがたくさんあると聞いたことが・・・
あぁ、こういうことか。
先は長いなぁ。
多分、イベントを連続して発行することでフレームワークの動きを実装しているのでしょう。MVCの代わりみたいなイメージなのかな。
そういえばワードプレスにもフックがたくさんあると聞いたことが・・・
あぁ、こういうことか。
先は長いなぁ。
0 件のコメント:
コメントを投稿