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

更新日期: 2019-06-06 阅读次数: 621 字数: 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年08月23日 处暑
2019年09月03日 抗日胜利纪念日
2019年09月08日 白露
2019年09月08日 国际扫盲日
2019年09月10日 教师节
2019年09月13日 中秋节
2019年09月16日 国际臭氧层保护日
2019年09月16日 世界清洁地球日
2019年09月18日 "九一八"事变纪念日
2019年09月20日 国际爱牙日
2019年09月21日 国际和平日
2019年09月22日 世界无车日
查看更多节日