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);
}