Python微信订餐小程序课程视频
https://blog.csdn.net/m0_56069948/article/details/122285951
Python实战量化交易理财系统
https://blog.csdn.net/m0_56069948/article/details/122285941
事件系统可以看成是行为系统的升级版,相比行为系统强大的地方在于事件本身可以是一个类,并且可以更好的支持事件订阅者。
事件相比较中间件的优势是事件比中间件更加精准定位(或者说粒度更细),并且更适合一些业务场景的扩展。例如,我们通常会遇到用户注册或者登录后需要做一系列操作,通过事件系统可以做到不侵入原有代码完成登录的操作扩展,降低系统的耦合性的同时,也降低了BUG的可能性。
步骤一:准备登录入口
首先准备一个登录入口 ,该入口本地的虚拟路由为 /api/login
| 123456789101112 | 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配置文件中进行绑定
| 1234567891011 | class
UserLoginAfterEvent
{
public
$user
;
public
function
__construct(
$user
)
{
$this
->user =
$user
;
echo
"user_login_after_event\n"
;
}
}
|
| 123 | 'bind'
=> [
'UserLoginAfter'
=> \app\common\event\UserLoginAfterEvent::
class
],
|
然后在user/login 方法后面增加触发事件代码
| 1234567891011121314 | 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 的输出结果如下:
| 12345 | login_entrance
login_after
user_login_after_event
|
经过验证 此时 使用事件标识触发 在UserLoginAfterEvent事件中 没有结果输出的。
步骤三:创建监听
创建事件监听类 UserLoginAfterListener.php,并在config/event.php配置文件中进行绑定
| 12345678 | class
UserLoginAfterListener
{
public
function
handle(
$user
)
{
// 事件监听处理
echo
"user_login_after_listener\n"
;
}
}
|
| 123456 | 'listen'
=> [
'UserLoginAfter'
=> [\app\common\listener\UserLoginAfterListener::
class
]
],
|
这时执行 /api/login 的输出结果如下:
| 12345 | login_entrance
login_after
user_login_after_listener
user_login_after_event
user_login_after_listener
|
另外在 UserLoginAfterListener 中打印 $user 的结果如下:
| 123 | ^
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、通过事件标识来监听时 ,在监听类中接受的值,是实际在触发事件时传入的参数,而通过事件类实例监听时,在监听类中拿到的是事件类实例。
注意:
在进行监听类绑定时,要注意标识后面的值是数组类型,使用下面这种方式,虽然没有报错,但是也不会生效。
| 1 | 'UserLoginAfter'
=> \app\common\listener\UserLoginAfterListener::
class
|
参考链接:https://www.kancloud.cn/manual/thinkphp6_0/1037492
转载请注明:xuhss » thinkphp6事件监听event-listene