Yii2关联事件求一个简单的demo或者指导 [ 2.0 版本 ]
应用场景:用户点击帖子收藏
基本流程:点击收藏后,数据表中添加一个当前帖子的收藏记录
事件触发:
1、帖子的收藏数+1
2、用户的积分+1
3、发送给帖子作者收藏通知
关联事件:
用户积分+1后又触发用户积分添加日志事件
疑问:
1、上述的描述是否正确?
2、用户积分+1后,如何再次触发积分添加日志事件?
最佳答案
-
- 描述没问题;
- 事件支持嵌套,事件 A 的处理函数(handler)内可以再触发事件 B, 进而执行事件 B 的处理函数。记得把所有这些操作放在一个事务内,避免出现 dirty data. 推荐 Stack Overflow 上讲事件使用的一个回答,我觉得讲得简单明了。https://stackoverflow.com/a/28586567/716273
共 1 条回复
其他 1 个回答
-
@mydzoo 事件的使用分三步:
- 定义事件和 handlers;
- 绑定
- 触发
在 init() 内绑定是一种常见的方法,好处是打开 AR 模型文件后,通过查看 init() 内绑定的事件就能快速了解事件触发后,都执行了哪些操作。还有一种绑定方式是动态绑定,即在逻辑代码内动态地完成绑定和触发操作。两种绑定方法有不同的使用场景,在 init() 内绑定适合那些通用的操作;动态绑定更加灵活,适合特定情况发生时的一些操作。
以你的应用场景为例,里面涉及两个事件:用户点击收藏按钮和积分发生变化,假设分别定义为
EVENT_AFTER_CLICKED_LIKE_BUTTON
和EVENT_AFTER_POINT_CHANGED
,之后定义四个 handlers:calculatePostLikeNumber()
: 帖子的收藏数+1calculateUserPoint()
: 用户的积分+1notifyAuthor()
: 发送给帖子作者收藏通知logPoint()
: 将积分变化情况记录到日志内
这四个 handlers 都适合放在 init() 内绑定,因为这些操作适合所有收藏帖子的行为。但是假设你想再加一个功能——如果积分 +1 后用户的积分达到 100 分,将用户所属的用户组由“普通用户”改为“高级用户”,这个操作就不能在 init() 内绑定,而应该使用动态绑定的方法,因为并不是所有点击收藏后都会触发更改用户组操作,还要判断用户的积分是否达标。
上面我假设的这种情况可以再定义一个"用户积分达到 100" 的事件(假设为
EVENT_POINT_REACHED_100
),再定义一个upgradeUserGroup()
handler, 用来升级用户组。动态绑定很简单,记住先绑定、后触发的原则即可,代码示例:
public function calculateUserPoint($event) { $userPoint++; if ($userPoint >= 100) { $user->on( User::EVENT_POINT_REACHED_100, [$user, 'upgradeUserGroup'] ); $user->trigger(User::EVENT_POINT_REACHED_100); } }
mydzoo
最后登录:2022-03-29
在线时长:53小时40分
- 粉丝4
- 金钱2075
- 威望10
- 积分2705