Laravel 中模型事件 Observer 的使用

应用场景

如果想监听 model 中的各种事件,诸如updatedcreateddeleted 等模型事件,你可以使用 Observer 类进行统一管理。只需这一个类,你就可以监听上述多种模型事件,十分地方便。

使用方法

举一个例子,假如你想监听 User 模型的变化。你可以使用以下命令创建 User 模型的观察者:

php artisan make:observer UserObserver --model=User

你会得到如下的文件:

<?php

namespace App\Observers;

use App\Models\User;

class UserObserver
{
    /**
     * Handle the User "created" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function created(User $user)
    {
        //
    }

    /**
     * Handle the User "updated" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function updated(User $user)
    {
        //
    }

    /**
     * Handle the User "deleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function deleted(User $user)
    {
        //
    }

    /**
     * Handle the User "restored" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function restored(User $user)
    {
        //
    }

    /**
     * Handle the User "force deleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function forceDeleted(User $user)
    {
        //
    }
}

然后,在 app/Providers/EventServiceProvider.php 中注册:

use App\Models\User;
use App\Observers\UserObserver;

/**
 * Register any events for your application.
 *
 * @return void
 */
public function boot()
{
    User::observe(UserObserver::class);
}

或者,你也可以在 app/Providers/AppServiceProvider.php 中注册:

use App\Models\User;

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

⚠️ 注意:不能在两个地方同时注册,否则会触发重复的动作。

Tips

  1. 使用正确的获取模型方法,以便更好的监听 update 事件。

        // wrong
        User::query()->where('id', $id)->update();
    
        // suggest
        User::find($id)->update();
        // or
        $user = User::find($id);
        $user->update();
  1. 监听某些字段的更新。

    /**
     * Handle the Seek "updated" event.
     *
     * @param User $user
     * @return void
     */
    public function updated(User $user)
    {
        if ($user->wasChanged('status')) {
            // to do something
        }
    }
    
    

上面使用到了 wasChanged() 方法,该方法是保存之后执行,查看监听的模型属性是否被修改。此外,还有 isDirty() 方法,该方法是在保存之前执行,作用同上。

上述代码实例 updated 方法中,监听的是更新执行后的数据变化, 应使用 wasChanged() 方法获取指定字段的变化,或者使用 getChanges() 方法,获取所有变化的字段。

本作品采用《CC 协议》,转载必须注明作者和本文链接
坚定地后端开发者
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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