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', ], ]; }
AppEventsUserEvent和 AppListenersUserListener按照模型名称自定义修改即可。
然后运行:
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'); } }