在 Laravel 中,事件有 普通事件,还有 模型事件。类似的有通知和广播。这里直接上用法。
来步骤走起
普通事件通常有事件,事件监听器,添加事件,分发这几步组成。
php artisan make:event WahahaEvent
# 生成事件
php artisan make:listener WahahaListener
# 生成监听器
# 在 App\Providers\EventServiceProvider 的 listener 中添加监听
# 事件对监听器 ,是一对多的关系。想做出多种监听,可以放在一起。比如事件是早晨上班打卡,监听有打卡时间,打卡位置。通过一个打卡事件,分发(后边有)到两个监听这里,两个监听就可以做相应的处理。这里只是打个比方,事件和监听器的一对多关系。
protected $listen = [
WahahaEvent::class => [
WahahaListener::class,
],
];
# 分发(事件,监听器,事件添加都好了,只剩下分发这一步,整过过程就走完了)
event(new WahahaEvent());
# 仅此一句 分发就完成了。event是分发函数,全局的。
上边是最基本,最简单的事件模型。通常,我们会在分发的时候,带一些数据过去。比如对应的 模型
# App\Models\Wahaha
# 假如模型就是 Wahaha
$model = Wahaha::where('id', 1)->first();
event(new WahahaEvent($model));
分发带来了数据,事件的构造函数会接受到。事件是这样的。
# App\Events\WahahaEvent
public $wahaha;
public function __construct(Wahaha $wahaha)
{
$this->wahaha = $wahaha;
}
事件只是个媒介,过程,真正处理逻辑在监听器里。所以监听器会用到刚才过来的数据。
# App\Listeners\WahahaListener
// 当事件被触发时,对应该事件的监听器的 handle() 方法就会被调用
public function handle(WahahaEvent $event)
{
// 获取到刚刚注册的用户
$wahaha = $event->wahaha;
// 下边就是你的业务逻辑的地方
}
在想,何必整得这么麻烦,直接在分发那里写逻辑不就好了吗。这样做,可以起到一个解耦的作用,还有代码的干净,以及复用等。
再来看模型事件
模型事件相对于普通事件,要简单很多。它只需要建立监听,并添加到服务即可。其实,模型事件也有普通事件的整个流程。可以了解下这个类 Illuminate\Database\Eloquent\Model
(模型的父类)
建立监听
php artisan make:observer WahahaObserver
<?php
namespace App\Observers;
use App\Models\Wahaha;
class WahahaObserver
{
public function creating(Wahaha $wahaha)
{
// 处理逻辑
}
}
添加服务到 App\Providers\AppServiceProvider
中
public function boot()
{
\App\Models\Wahaha::observe(\App\Observers\WahahaObserver::class);
}
这样,流程就走完了。是不是很短暂。当模型 Wahaha 调用 create 方法后,就会自动触发监听。但是这里监听的只能是下边的几种操作。
// creating, created, updating, updated, saving,
// saved, deleting, deleted, restoring, restored