觀察者Observer模型事件,使用注意情況

kingjian發表於2021-03-26

觀察者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 協議》,轉載必須註明作者和本文連結

相關文章