Laravel的模型事件 入门

  • 2020 年 1 月 26 日
  • 筆記

Laravel中模型事件什么意思?

Laravel已经实现定义了不少的模型事件:

creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored

如上名称,代表在具体的模型中,当发生:正在新增、已新增、已更新…模型时,要去触发的一些事件。


Laravel中有三种方法来定义模型事件。


这里全部以用户创建时为例(creating)

数据库这些实现就创建好了:

1.events属性

无道愣是没测试成功,估计哪步没对。

就是在模型文件中定义一些属性

A. 在app/Providers/EventServiceProvider.php定义

class EventServiceProvider extends ServiceProvider  {        protected $listen = [          'AppEventsUserEvent' => [              'AppListenersUserListener',          ],      ];    }

AppEventsUserEventAppListenersUserListener按照模型名称自定义修改即可。

然后运行:

php  artisan event:generate

就会生成event和listener文件:

B. listen 中handle 方法注入对应事件类

class UserListener  {        public function handle(UserEvent $event)      {          dd('修改什么?');      }  }

C. 最后在 模型中添加 'events' 属性

class User extends Authenticatable  {      use Notifiable;      protected $events = [          'saved' => UserEvent::class,      ];  }

2.观察者

A. 先定义一个观察者

<?php  namespace AppObserver;      use AppUser;    class UserObserver  {        /**       * 监听用户创建事件.       *       * @param User $user       * @return void       */      public      function created(User $user)      {        }        /**       * 监听用户创建/更新事件.       *       * @param User $user       * @return void       */      public      function saved(User $user)      {          //      }  }

B. 在某个服务提供者的boot方法中注册观察者:

<?php    namespace AppProviders;    use AppObserverUserObserver;  use AppUser;  use IlluminateSupportServiceProvider;    class AppServiceProvider extends ServiceProvider  {        /**       * Bootstrap any application services.       *       * @return void       */      public function boot()      {          User::observe(UserObserver::class);      }  }

C. User模型中使用

class User extends Authenticatable  {      use Notifiable;      protected $observables = [          'created', 'creating', 'updating'      ];    }

这里的$observables属性的值和UserObserver里面定义的方法名称一样。

D. 测试成功

路由:

Route::get('/', function () {      $user = User::find(1);      // $user->name = 'wudao';      // $user->save();      $user->update(['name' => 'wudao12']);  });

3.静态方法

还可以通过模型上的对应静态方法来定义一个事件,在EventServiceProvider的boot方法里面定义:

<?php  namespace AppProviders;    class EventServiceProvider extends ServiceProvider  {        public function boot()      {          parent::boot();          User::saved(function(User$user) {            });          User::updated('AppListenerUserListener@updated');      }  }