本文共 1241 字,大约阅读时间需要 4 分钟。
事件机制包含三个角色。
定义一个类,一般需要存储一些源数据,因此事件对象应该采用短生命周期的写法,即使用 new UserRegisterd($userId) 的写法。
触发事件,一般需要传递源数据到事件对象里,并且使该事件的所有监听者去做相应的处理。
调度器会将事件对象传递到监听器,监听器得到事件并做相应的处理。由于对象的传递是引用传递,且监听器是串行执行的,所以在监听器里面可以改变事件对象的数据,以传递到下一个监听器继续处理,一个事件可以被多个监听器监听,一个监听器可以监听多个事件,可以设置监听器的执行先后顺序。
app/Event/UserPayedEvent.php
data = $data; } public function __destruct() { echo 'UserPayedEvent destruct'.PHP_EOL; }}
app/Event/UserRegisterEvent.php
data = $data; } public function __destruct() { echo 'UserRegisterEvent destruct'.PHP_EOL; }}
app/Listener/SendEmailListener.php
data); }}
app/Listener/SendSmsListener.php
data); }}
排在前面的监听器先被执行。
config/autoload/listeners.php
app/Controller/IndexController.php
request->input('userId', 0); $this->eventDispatcher->dispatch((new UserRegisterEvent($userId))); echo 'done'.PHP_EOL; } public function testUserPayed() { $userId = $this->request->input('userId', 0); $money = $this->request->input('money', 0); $this->eventDispatcher->dispatch((new UserPayedEvent(['userId'=>$userId, 'money'=>$money]))); }}
多个监听器是串行的,且是有顺序的。
事件对象被最后一个监听器执行完就会被释放掉。转载地址:http://gbaui.baihongyu.com/