将心比心,方得人心~

laravel 事件监听的几种方式

周洲 2021-05-19 19:39:35

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















打赏

『微信打赏』

Tag标签laravel  事件 

我是有底线的