企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# [thinkphp6事件监听event-listene](https://www.cnblogs.com/wqy415/p/16148492.html) 事件系统可以看成是行为系统的升级版,相比行为系统强大的地方在于事件本身可以是一个类,并且可以更好的支持事件订阅者。 事件相比较中间件的优势是事件比中间件更加精准定位(或者说粒度更细),并且更适合一些业务场景的扩展。例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了BUG的可能性。 步骤一:准备登录入口 ​ 首先准备一个登录入口 ,该入口本地的虚拟路由为 /api/login ``` `class``User``extends``BaseController` `{` `public``function``login()` `{` `//执行登录操作` `echo``"login_entrance\n"``;` `$user``= \app\common\model\User::find(1)->toArray();` `//登录成功后的操作,比如可以分配邀请奖励,写入登录日志等` `echo``"login_after\n"``;` `}` `}` ``` 步骤二:创建事件 创建UserLoginAfterEvent事件,并在config/event.php配置文件中进行绑定 ``` `class``UserLoginAfterEvent` `{` `public``$user``;` `public``function``__construct(``$user``)` `{` `$this``->user =``$user``;` `echo``"user_login_after_event\n"``;` `}` `}` ``` ``` `'bind'`     `=> [` `'UserLoginAfter'``=> \app\common\event\UserLoginAfterEvent::``class` `],` ``` 然后在user/login 方法后面增加触发事件代码 ``` `public``function``login()` `{` `//执行登录操作` `echo``"login_entrance\n"``;` `$user``= \app\common\model\User::find(1)->toArray();` `//登录成功后的操作,比如可以分配邀请奖励,写入登录日志等` `echo``"login_after\n"``;` `/** 触发事件 */` `// 通过事件标识` `event(``"UserLoginAfter"``,``$user``);` `// 传入事件对象实例` `event(``new``UserLoginAfterEvent(``$user``));` `}` ``` 这时执行 /api/login 的输出结果如下: ``` `login_entrance` `login_after` `user_login_after_event` ``` 经过验证 此时 使用事件标识触发 在UserLoginAfterEvent事件中 没有结果输出的。 步骤三:创建监听 创建事件监听类 UserLoginAfterListener.php,并在config/event.php配置文件中进行绑定 ``` `class``UserLoginAfterListener` `{` `public``function``handle(``$user``)` `{` `// 事件监听处理` `echo``"user_login_after_listener\n"``;` `}` `}` ``` ``` `'listen'`   `=> [` `'UserLoginAfter'``=> [\app\common\listener\UserLoginAfterListener::``class``]` `],` ``` 这时执行 /api/login 的输出结果如下: ``` `login_entrance` `login_after` `user_login_after_listener` `user_login_after_event` `user_login_after_listener` ``` 另外在 UserLoginAfterListener 中打印 $user 的结果如下: ``` `^``array``:3 [ ``"id"``=> 1 ``"username"``=>``"wangqy"` `"password"``=>``"123456"``]` `^ app\common\event\UserLoginAfterEvent {#88  +user:``array``:3 [   ``"id"``=> 1   ``"username"``=>``"wangqy"`   `"password"``=>``"123456"` `]}` ``` 结论 通过上述测试得出的结果如下: 1、使用事件标识来监听时 是不走定义的事件类的,只有在event方法中传入事件实例才能够在事件类进行操作值。 2、通过事件标识来监听时 ,在监听类中接受的值,是实际在触发事件时传入的参数,而通过事件类实例监听时,在监听类中拿到的是事件类实例。 注意: 在进行监听类绑定时,要注意标识后面的值是数组类型,使用下面这种方式,虽然没有报错,但是也不会生效。 ``` `'UserLoginAfter'``=> \app\common\listener\UserLoginAfterListener::``class` ```