监听 Laravel Model 生命周期中的 create delete 事件

更新日期: 2019-06-06 阅读次数: 177 字数: 385 分类: Laravel

现实场景

一个论坛系统,当后台管理人员进行删帖,需要对用户的发帖量进行重新计算。

所以,需要能监听 Model 的删除事件。

三种实现方法。后面两种为官方推荐的方法,然而我更喜欢第一种。。。

方法一

  • 优点:简单粗暴
  • 缺点:可读性不好。当你没看过 AppServiceProvider,并不知道还有这个触发的逻辑。

app/Providers/AppServiceProvider.php

public function boot()
{
    Post::deleted(function($post){
        $user_id = $post->user_id;
        $post_count = Post::where([
            ['user_id', $user_id],
            ['status', 1],
        ])->count();
        $user = User::find($user_id);
        $user->post_count = $post_count;
        $user->save();
    });
}

方法二:标准的 Event 事件处理

  • 优点:可读性最好。Model 中可以清楚地看到关系。
  • 缺点:啰嗦。需要定义一个 Event,一个 Listener。

新建一个帖子删除对应的事件

php artisan make:event PostDeleted

运行命令之后,会发现多了一个文件

new file:   app/Events/PostDeleted.php

这个也好麻烦,还需要实现一个 listener 。。。

Model 中再通过 events map 来指定对应逻辑。

方法三:Model 的 Observers

  • 优点:集中处理 Model 的生命周期
  • 缺点:可读性问题,同方法一。

参考:

https://laravel.com/docs/5.5/eloquent#observers

Observers 需要在 AppServiceProvider 中注册,所以当你没看过 AppServiceProvider ,单纯看 Model 的定义时,根本无法感知到这个 Model 还有一个对应的 Observers 。

而,标准的 Event 事件处理则可以通过 events map 来清楚的看到每个 model 事件对应的处理操作。

爱评论不评论

近期节日

2019年06月20日 世界难民日
2019年06月21日 夏至
2019年06月22日 中国儿童慈善活动日
2019年06月23日 国际奥林匹克日
2019年06月25日 全国土地日
2019年06月26日 国际禁毒日
2019年06月30日 世界青年联欢节
2019年07月01日 中国共产党诞生日
2019年07月01日 香港回归日
2019年07月02日 国际体育记者日
2019年07月06日 国际接吻日
2019年07月07日 抗日战争纪念日
查看更多节日