Laravel 6 模型事件使用

8 篇文章 0 订阅

Laravel 6 模型事件使用

所有支持的模型事件
在 Eloquent 模型类上进行查询、插入、更新、删除操作时,会触发相应的模型事件,不管你有没有监听它们。这些事件包括:

retrieved获取到模型实例后触发
creating插入到数据库前触发
created插入到数据库后触发
updating更新到数据库前触发
updated更新到数据库后触发
saving保存到数据库前触发(插入/更新之前,无论插入还是更新都会触发)
saved保存到数据库后触发(插入/更新之后,无论插入还是更新都会触发)
deleting从数据库删除记录前触发
deleted从数据库删除记录后触发
restoring恢复软删除记录前触发
restored恢复软删除记录后触发

注:批量更新时不会触发相应事件,因为是直接走查询构建器完成的,绕过了模型方法。

通过监听这些事件,我们可以在 Eloquent 模型实例生命周期的特定阶段执行特定操作。在 Laravel 中我们有多种方式来监听模型事件。

一、通过静态方法监听模型事件

通过在模型类上调用要监听事件对应的静态方法,一般我们会在某个服务提供者的 boot方法中完成这项工作,比如 EventServiceProvider。举个例子,假设我们要监听每次获取模型实例的事件并在日志中记录查询到的用户信息,可以这么做:

// app/Providers/EventServiceProvider.php

public function boot()
{
    parent::boot();
    // 监听模型获取事件
    User::retrieved(function ($user) {
        Log::info('从模型中获取用户[' . $user->id . ']:' . $user->name);
    });
}

上面这段代码中表示我们在 User模型上监听 retrieved事件,然后通过一个闭包函数执行对应的处理逻辑,该闭包函数传入参数是模型实例,在处理逻辑中,我们通过 Log门面记录日志信息。

二、通过订阅者监听模型事件

1.先创建对应的事件类

以查询模型为例进行演示。我们通过 Artisan 命令来完成事件类初始化:

php artisan make:event UserRetrieved

然后在这个事件类中都添加 $user 属性并在构造函数中传入:

// app/Events/UserDeleted.php
// app/Events/UserDeleting.php

public $user;
public function __construct(User $user)
{
    $this->user = $user;
}
2.建立模型事件与自定义事件类的映射

User模型类中建立模型事件与自定义事件类的映射,这可以通过 $dispatchesEvents 属性来完成:

//建立模型事件与自定义事件类的映射
 protected $dispatchesEvents = [
        'retrieved' => UserRetrieved::class
 ];

这样,当我们触发 查询事件时,底层会将其转化为触发 UserRetrieved事件。

3.创建订阅者监听事件类

我们还要监听上述自定义的事件类,我们可以通过在 EventServiceProviderlisten属性中为每个事件绑定对应的监听器类,也可以通过为某个模型类创建一个事件订阅者类来统一处理该模型中的所有事件。在 app/Listeners目录下创建一个UserEventSubscriber.php 文件作为订阅者类,编写代码如下

<?php

namespace App\Listeners;

use App\Events\UserDeleted;
use App\Events\UserDeleting;
use Illuminate\Support\Facades\Log;

class UserEventSubscriber
{
     /**
     * 处理用户查询后事件
     */
    public function onUserRetrieved($event)
    {
        Log::info('weihang ======> 我在查询模型[' . $event->user->id . ']:' . $event->user->name);
    }

    /**
     * 为订阅者注册监听器
     *
     * @param  Illuminate\Events\Dispatcher $events
     */
    public function subscribe($events)
    {
        $events->listen(
            UserRetrieved::class,
            UserEventSubscriber::class . '@onUserRetrieved'
        );
    }
}
4.在 EventServiceProvider 中注册这个订阅者
// app/Providers/EventServiceProvider.php

protected $subscribe = [
    UserEventSubscriber::class
];

运行查询代码

//UserModel 
$data = UserModel ::find(3);

查看日志

cat laravel.log

输出结果

[2020-03-04 03:27:07] local.INFO: weihang ======> 我在查询模型[3]:weihang4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值