Write the Code. Change the World.

7月 31

在 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

参考

中文文档

模型事件