Eloquent 模型触发几个事件,允许你挂接到模型生命周期的如下节点: retrieved、creating、created、updating、updated、saving、saved、deleting、deleted、restoring、restored、replicating。事件允许你每当特定模型保存或更新数据库时执行代码。每个事件通过其构造器接受模型实例。
retrieved 事件在现有模型从数据库中查找数据时触发。当新模型每一次保存时,creating 和 created 事件被触发。如果数据库中已经存在模型并且调用了 save 方法,updating / updated 事件被触发。这些情况下,saving / saved 事件也被触发。
注意:通过 Eloquent 进行批量更新时,被更新模型的 saved 和 updated, deleting 和 deleted 事件不会被触发。这是因为批量更新时,并没有真的获取模型。
一、使用闭包
直接在模型booted方法内使用闭包:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 模型的 "booted" 方法 * * @return void */ protected static function booted() { static::created(function ($user) { // 创建了数据时执行 }); } }
二、为每一个生命周期节点单独创建监听器
1、Providers\EventServiceProvider.php 在 $listen内添加一个监听创建用户的监听器
protected $listen = [ 'App\Events\UserSaved' => [ 'App\Listeners\SaveUser', ], ];
2、执行命令 php artisan event:generate(或手动添加)
app目录下生成Events目录,包含UserSaved.php类,添加代码如下:
<?php namespace App\Events; use App\Models\User; use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\PrivateChannel; use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Queue\SerializesModels; class UserSaved { use Dispatchable, InteractsWithSockets, SerializesModels; public $user; /** * Create a new event instance. * * @return void */ public function __construct(User $user) { $this->user = $user; } /** * Get the channels the event should broadcast on. * * @return \Illuminate\Broadcasting\Channel|array */ public function broadcastOn() { return new PrivateChannel('channel-name'); } }
app目录下生成Listeners目录,包含SaveUser.php类,添加代码如下:
<?php namespace App\Listeners; use App\Events\UserSaved; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\InteractsWithQueue; class SaveUser { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param UserSaved $event * @return void */ public function handle(UserSaved $event) { echo '通过监听者模式检测到添加了数据'; } }
3、用户模型添加:
protected $dispatchesEvents = [ 'saved' => UserSaved::class ];
三、通过添加观察器监听事件,可以将所有监听器放到这个类进行管理。
1、执行命令:
php artisan make:observer UserObserver --model=User
生成目录UserObserver和UserObserver类,包含代码:
<?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) { echo '观察者模式监听到添加了数据'; } /** * 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) { // } }
2、注册观察者
找到Providers\AppServiceProvider.php,添加代码
use App\Models\User; public function boot() { User::observe(UserObserver::class); }