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