Laravel使ってみた (16) - Events -
http://laravel.com/docs/events のドキュメント読み
要はイベントというのを作って、そいつをtrigger(公式的にはfire)的な事をする事で処理を行う機能的な所か。Queueとはまた話が違うっぽいので
でEventの登録方法はEvent::listenを使うんだけど、app/start/global.phpとかで普通に記述するか http://laravel.com/docs/events#event-subscribers セクションのようにクラスを用いてEvent::listenさせるかっていう、とりあえずは2種類がある模様
まずは前者の普通にクラスを使わずにapp/start/global.phpとかに定義
Event::listen(
"hoge", // Event name
function() {
echo "hoge(1)";
},
1 // Priority
);
Event::listen(
"hoge",
function() {
echo "hoge(5)";
},
5
);
っていうような感じなんですが、Priorityな引数が基本的に大きい方から実行されていく模様。で指定しなかった場合のデフォルトのプライオリティは0。でEventをtriggerしちゃう場合には
Event::fire("hoge", [引数]);
引数が1つであれば別に引数な所をArrayで指定する必要はない(Illuminate\Events\Dispatcher.phpの174行目でArrayに内包するようになってる為)
でちなみにEvent自体はクラスで利用する事も出来る
class HogeEvent {
public function handle() {
echo "hoge";
}
}
デフォルトだとhandleメソッドが動くけど
Event::listen("hoge", "HogeEvent@hoge");
のようにルーティングでアクションに対するコントローラーのメソッドを指定するような形式でEventが発動されるメソッドを指定する事も可能な模様。んまぁ定義から実行はこんな感じな訳で、でEvent::listenクラス上で行わせるsubscriberっていう機能もある
class HogeSubscribe {
public function subscribe() {
Event::listen("hoge", "HogeEvent");
}
}
でapp/start/global.phpとかで
Event::subscribe(new HogeSubscribe());
的な事やれば良い。subscribeの引数はインスタンスじゃなくても普通にクラス名でもオッケーっぽい感じがする(ソース読んだ所だと)。でイベントにはワイルドカードを使って定義する事も可能
Event::listen("hoge.fuga", function() {
echo "fuga";
});
Event::listen("hoge.*", function() {
var_dump(func_get_args());
});
っていう感じ。hoge.fugaっていうイベントがEvent::fireされると
- hoge.fugaが発動
- hoge.*が発動
っていうようになる。どうやらこれはプライオリティを指定する事出来ないっぽい(ソース上でsetupWildcardListenで何かPriorityを維持するような構造になってないっぽい)
でEvent::queueに関して。Queueクラスっていうのがあるけどこれとは関係が無い。単純に引数で指定したイベント名+_queueで定義しておいて、それがfireされたら元のイベント名の処理を実行するような感じ。んーわかりづらい
// この時点ではhoge_queueっていうイベントを作ってるだけなので何も起きない
Event::queue("hoge");
// Event::flushを使う事でqueueなイベントをfire出来る
Event::flush("hoge");
// 単純にイベント名_queueで定義されるだけなのでfireでも出来る
Event::fire("hoge_queue", true);
的な感じかなと。個人的に使い所あんのか無いのか微妙。あとflusherっていうメソッドがある的な事をドキュメントに書いてるけど実装されてない模様。もしくはdeprecateで消えたとか?
とりまぁEventsなドキュメント読み終わりって事で。
ちなみに以前にUnit TestingでEventをテストするっていうのあったけどまだ今回は手付かずなのでやり次第追記するかも
追記1: ワイルドカードなイベントを着火させない方法
上記のようにhoge.fugaとhoge.*があってhoge.fugaに着火させるとhoge.*にまで及ぶっていう形にはなるが、hoge.fugaな所からreturn falseしちゃうとStop Propagationされてそこで止まるっぽい
っていうのを書くの忘れてた