2017-06-09 18:27:14 2097次浏览 2条回答 0 悬赏 10 金钱

应用场景:用户点击帖子收藏

基本流程:点击收藏后,数据表中添加一个当前帖子的收藏记录

事件触发:
1、帖子的收藏数+1
2、用户的积分+1
3、发送给帖子作者收藏通知

关联事件:
用户积分+1后又触发用户积分添加日志事件

疑问:
1、上述的描述是否正确?
2、用户积分+1后,如何再次触发积分添加日志事件?

最佳答案

  • drodata 发布于 2017-06-09 22:08 举报
    1. 描述没问题;
    2. 事件支持嵌套,事件 A 的处理函数(handler)内可以再触发事件 B, 进而执行事件 B 的处理函数。记得把所有这些操作放在一个事务内,避免出现 dirty data. 推荐 Stack Overflow 上讲事件使用的一个回答,我觉得讲得简单明了。https://stackoverflow.com/a/28586567/716273
    1 条回复
    回复于 2017-06-10 09:52 回复

    非常感谢您的指导,能否分享下如何去分层设计这些功能呢,做到有效的解耦呢?看了文档,事件绑定直接在AR类的init()初始化中就提前绑定好?在需要的地方直接trigger触发,可以这样理解吗?

  • 回答于 2017-06-10 19:03 举报

    事件的使用分三步:

    • 定义事件和 handlers;
    • 绑定
    • 触发

    在 init() 内绑定是一种常见的方法,好处是打开 AR 模型文件后,通过查看 init() 内绑定的事件就能快速了解事件触发后,都执行了哪些操作。还有一种绑定方式是动态绑定,即在逻辑代码内动态地完成绑定和触发操作。两种绑定方法有不同的使用场景,在 init() 内绑定适合那些通用的操作;动态绑定更加灵活,适合特定情况发生时的一些操作。

    以你的应用场景为例,里面涉及两个事件:用户点击收藏按钮和积分发生变化,假设分别定义为 EVENT_AFTER_CLICKED_LIKE_BUTTONEVENT_AFTER_POINT_CHANGED,之后定义四个 handlers:

    • calculatePostLikeNumber(): 帖子的收藏数+1
    • calculateUserPoint(): 用户的积分+1
    • notifyAuthor(): 发送给帖子作者收藏通知
    • 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
总监

mydzoo

注册时间:2017-01-05
最后登录:2022-03-29
在线时长:53小时40分
  • 粉丝4
  • 金钱2075
  • 威望10
  • 积分2705

热门问题