观察者Observer模型事件,使用注意情况

观察者Observer模型事件使用

了解一下观察者有那些事件?怎么使用

想在一个模型中监听多个事件,可以把它写成一个类,类中的方法名称即是你想要监听的事件名称

class ArticleObserver
{

 /**
 * 监听数据即将创建的事件。
 *
 * @param  Article $article
 * @return void
 */
 public function creating(Article $article) 
 {
 }

 /**
 * 监听数据创建后的事件。
 *
 * @param  Article $article
 * @return void
 */
 public function created(Article $article) 
 {
 }

 /**
 * 监听数据即将更新的事件。
 *
 * @param  Article $article
 * @return void
 */ 
 public function updating(Article $article) 
 {
 }

 /**
 * 监听数据更新后的事件。
 *
 * @param  Article $article
 * @return void
 */
 public function updated(Article $article) 
 {
 }

 /**
 * 监听数据即将保存的事件。
 *
 * @param  Article $article
 * @return void
 */
 public function saving(Article $article) 
 {
 }

 /**
 * 监听数据保存后的事件。
 *
 * @param  Article $article
 * @return void
 */
 public function saved(Article $article) 
 {
 }

 /**
 * 监听数据即将删除的事件。
 *
 * @param  Article $article
 * @return void
 */
 public function deleting(Article $article)
 {
 }

 /**
 * 监听数据删除后的事件。
 *
 * @param  Article $article
 * @return void
 */
 public function deleted(Article $article)
 {
 }

 /**
 * 监听数据即将从软删除状态恢复的事件。
 *
 * @param  Article $article
 * @return void
 */
 public function restoring(Article $article) 
 {
 }

 /**
 * 监听数据从软删除状态恢复后的事件。
 *
 * @param  Article $article
 * @return void
 */
 public function restored(Article $article) 
 {
 }
 }

实际业务使用场景

删除文章业务

不生效做法

/**
 * 删除方案
 * @param $ids
 * @return mixed
 */
 public function delete($ids)
 {
     return Scheme::query()->whereIn('id', $ids)->get()->delete();
 }

生效做法

  • 第一种
    /**
    * 删除文章
    * @param $ids
    * @return mixed
    */
    public function delete($ids)
    { 
       return Article::query()->whereIn('id', $ids)->get()->each->delete();
    }
  • 第二种
    /**
    * 删除文章
    * @param $ids
    * @return mixed
    */
    public function delete($ids)
    {
    $articles = Article::query()->whereIn('id', $ids)->get();
       foreach ($articles as $article){
           $article->delete();
       }
    }

创建观察者文件

namespace App\Observers;

use App\MicroServices\Scheme\Models\Article;
use App\MicroServices\Article\Services\TagService;

class ArticleObserver
{
 /** * 监听文章删除后需要处理业务,减少标签引用
 * @param Article $scheme
 */ public function deleted(Article $article)
 { //减标签引用数量
 $tagService = app(TagService::class); $tagService->decreaseCount($article->tag_id,1);
 }}

注册观察者

需要在App\Providers\AppServiceProvider.php文件注册观察者

 /**
 * Bootstrap any application services. * * @return void */ public function boot()
 { Article::observe(ArticleObserver::class);
 }

有帮助到你记得点赞,收藏👍👍👍

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!