通常我们有这样的业务需求,如果Model的某个字段发生了变化,就做出对应的业务处理,那么怎么才能监测到字段的变化呢,Laravel的Eloquent Model模型为我们提供了一套解决方案。其实就是利用Observer监听Model。
执行命令
| 12
 3
 4
 5
 6
 
 | 1、创建事件
 php artisan make:observer AfterSaleObserver --model=Models/User
 
 2、在 AppServiceProvider 里面注册事件
 
 
 | 
在 Observers目录下回生成 UserObserver文件
事件
Eloquent 的模型触发了几个事件,可以在模型的生命周期的以下几点进行监控: retrieved、creating、created、updating、updated、saving、saved、deleting、deleted、restoring、restored。事件能在每次在数据库中保存或更新特定模型类时轻松地执行代码。
从数据库中检索现有模型时会触发 retrieved 事件。当新模型第一次被保存时, creating 以及 created 事件会被触发。如果模型已经存在于数据库中并且调用了 save 方法,会触发 updating 和 updated 事件。在这两种情况下,saving / saved 事件都会触发。
开始前,在 Eloquent 模型上定义一个 $dispatchesEvents 属性,将 Eloquent 模型的生命周期的各个点映射到你的 事件类 中。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | <?php
 namespace App;
 
 use App\Events\UserSaved;
 use App\Events\UserDeleted;
 use Illuminate\Notifications\Notifiable;
 use Illuminate\Foundation\Auth\User as Authenticatable;
 
 class User extends Authenticatable
 {
 use Notifiable;
 
 
 
 
 
 
 protected $dispatchesEvents = [
 'saved' => UserSaved::class,
 'deleted' => UserDeleted::class,
 ];
 }
 
 | 
观察器
如果要给某个模型监听很多事件,则可以使用观察器将所有监听器分组到一个类中。观察器类里的方法名应该对应 Eloquent 中你想监听的事件。 每种方法接收 model 作为其唯一的参数。Laravel 没有为观察器设置默认的目录,所以你可以创建任何你喜欢你的目录来存放:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 
 | <?php
 namespace App\Observers;
 
 use App\User;
 
 class UserObserver
 {
 
 
 
 
 
 
 public function created(User $user)
 {
 
 $user->getOriginal('status');
 $user->getOriginal();
 }
 
 
 
 
 
 
 
 public function updated (User $user) {
 
 $newStatus = $user->status;
 $oldStatus = $user->getOriginal('status');
 $oldUser = $user->getOriginal();
 
 if ($newStatus != $oldStatus) {
 
 Logger::info($user->getOriginal());
 }
 
 }
 
 
 
 
 
 
 
 public function deleting(User $user)
 {
 
 }
 }
 
 | 
要注册一个观察器,需要在模型上使用 observe 方法。你可以在服务提供器中的 boot 方法注册观察器。在这个例子中,我们将在 AppServiceProvider 注册观察器:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 
 | <?php
 namespace App\Providers;
 
 use App\User;
 use App\Observers\UserObserver;
 use Illuminate\Support\ServiceProvider;
 
 class AppServiceProvider extends ServiceProvider
 {
 
 
 
 
 
 public function boot()
 {
 User::observe(UserObserver::class);
 }
 
 
 
 
 
 
 public function register()
 {
 
 }
 }
 
 
 
 |