//01观察者
Eloquent 模型会触发许多事件(Event),我们可以对模型的生命周期内多个时间点进行监控:
creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored。
事件让你每当有特定的模型类在数据库保存或更新时,执行代码。当一个新模型被初次保存将会触发 creating 以及 created 事件。
如果一个模型已经存在于数据库且调用了 save 方法,将会触发 updating 和 updated 事件。在这两种情况下都会触发 saving 和 saved 事件。
Eloquent 观察器允许我们对给定模型中进行事件监控,观察者类里的方法名对应 Eloquent 想监听的事件。每种方法接收 model 作为其唯一的参数。
1,创建文件app/Observers/模型Observer.php
2,注册的方式
1)在模型中注册
protected $dispatchesEvents = [
'saved' => UserSaved::class,
'deleted' => UserDeleted::class,
];
2)在 AppServiceProvider 中注册观察者
/**
* 运行所有应用服务.
*
* @return void
*/
public function boot()
{
User::observe(UserObserver::class);
}
3,编辑监听需观察者类 在模型Observer.php中
每个方法接受 model 作为唯一参数。Laravel 不包含观察者的默认目录,所以你可以创建任何你喜欢的目录来存放观察者类.
namespace App\Observers;
use App\User;
class UserObserver
{
/**
* 监听创建用户事件.
*
* @param \App\User $user
* @return void
*/
public function created(User $user)
{
//
}
/**
* 监听删除用户事件.
*
* @param \App\User $user
* @return void
*/
public function deleting(User $user)
{
//
}
}
总结:对于模型的 增、删、改、查 的相关事件,使用观察者类更为方便。
//02 事件
1,在EventServiceProvider中注册 监听器 和 事件
例:
/**
* 应用程序的事件监听器映射。
*
* @var array
*/
protected $listen = [
'App\Events\OrderShipped' => [
'App\Listeners\SendShipmentNotification',
...,
...,可以监听多个事件
],
];
2,生成事件 & 监听器
为每个事件和监听器手动创建文件是件很麻烦的事情,
而在这里,你只需将监听器和事件添加到 EventServiceProvider 中,
再使用 event:generate 命令即可。这个命令会生成在 EventServiceProvider
中列出的所有事件和监听器。当然,已经存在的事件和监听器将保持不变。
php artisan event:generate
3,我们进入app\Events目录的事件类中
namespace App\Events;
class Register
{
public $uid;
/**
* 创建一个新的事件实例.
*
* @param Order $order
* @return void
*/
public function __construct($uid)
{
$this->uid = $uid;
}
}
这样就可以了。
4,然后去app\Listeners目录进入事件监听类。
namespace App\Listeners;
use App\Events\Register;
use App\Models\User;
use Illuminate\Contracts\Queue\ShouldQueue;
class SendHelpInformation implements ShouldQueue
{
public function __construct()
{
//
}
public function handle(Register $event)
{
$uid = $event->uid;
$user = User::find($uid);
//......各种实现
}
}
总结:这个handle方法就是我们要做的具体实现了,有个很方便的功能就是如果
implements ShouldQueue这个接口的话就会
异步队列执行,
如果
去掉的话就是
同步执行。很方便有没有,这样代码就解耦了,不需要再管注册代码了,在这里就能很方便的管理了。多人开发也是单独写自己的Listeners就可以了。