美文网首页laravel
laravel 通过观察者监听模型事件

laravel 通过观察者监听模型事件

作者: 足迹人生2017 | 来源:发表于2019-01-24 09:18 被阅读0次

原文:https://laravelacademy.org/post/9713.html

所有支持的模型事件

在 Eloquent 模型类上进行查询、插入、更新、删除操作时,会触发相应的模型事件(关于事件我们后面会单独讲),不管你有没有监听它们。这些事件包括:

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

注:批量更新时不会触发相应事件,因为是直接走查询构建器完成的,绕过了模型方法。
通过监听这些事件,我们可以在 Eloquent 模型实例生命周期的特定阶段执行特定操作。在 Laravel 中我们有多种方式来监听模型事件。

通过观察者监听模型事件

针对模型事件这种特殊的事件类型,Laravel 还为我们提供了观察者类来处理模型事件的监听。观察者可以看作是上述订阅者处理模型事件的简化版本,我们不需要自定义事件类,不需要建立映射关系,只需要在观察者类中将需要监听的事件定义为同名方法,并在相应方法中编写业务处理代码即可。当某个模型事件触发时,Eloquent 底层会去该模型上注册的观察者类中通过反射查找是否定义了对应的方法,如果定义了则执行相应的逻辑,否则忽略。

下面我们以savingsaved事件为例演示如何通过观察者监听模型事件。

首先,我们通过 Artisan命令初始化针对 User 模型的观察者:

php artisan make:observer UserObserver --model=User

默认生成的 UserObserver 会为 createdupdateddeletedrestoredforceDeleted(强制删除) 事件定义一个空方法:

你可以把前面定义的retriveddeletingdeleted 事件监听代码迁移过来,也可以将不需监听的事件方法移除,这里我们将编写保存模型时涉及的模型事件,包括 savingcreatingupdatingupdatedcreatedsaved

<?php

namespace App\Observers;

use App\User;
use Illuminate\Support\Facades\Log;

class UserObserver
{
    public function saving(User $user)
    {
        Log::info('即将保存用户到数据库[' . $user->id . ']' . $user->name);
    }

    public function creating(User $user)
    {
        Log::info('即将插入用户到数据库[' . $user->id . ']' . $user->name);
    }

    public function updating(User $user)
    {
        Log::info('即将更新用户到数据库[' . $user->id . ']' . $user->name);
    }

    public function updated(User $user)
    {
        Log::info('已经更新用户到数据库[' . $user->id . ']' . $user->name);
    }

    public function created(User $user)
    {
        Log::info('已经插入用户到数据库[' . $user->id . ']' . $user->name);
    }

    public function saved(User $user)
    {
        Log::info('已经保存用户到数据库[' . $user->id . ']' . $user->name);
    }
}

编写好观察者后,需要将其注册到 User 模型上才能生效,我们可以在 EventServiceProvider 的 boot 方法中完成该工作:

public function boot()
{
    parent::boot();

    User::observe(UserObserver::class);

    ...
}

接下来,我们来测试观察者监听模型事件。我们先编写一段添加新用户的代码:

$user = new User();
$user->name = '学院君测试号01';
$user->email = 'test01@laravelacademy.org';
$user->password = bcrypt('secret');
$user->save();

执行上述代码后,即可在日志文件中看到相应的日志记录:

[2018-12-05 02:50:00] local.INFO: 即将保存用户到数据库[]学院君测试号01  
[2018-12-05 02:50:00] local.INFO: 即将插入用户到数据库[]学院君测试号01  
[2018-12-05 02:50:00] local.INFO: 已经插入用户到数据库[19]学院君测试号01  
[2018-12-05 02:50:00] local.INFO: 已经保存用户到数据库[19]学院君测试号01  

同理,编写一段更新已存在用户的代码:

$user = User::findOrFail(15);
$user->name = '学院君测试号15';
$user->save();

执行上述代码,对应的日志记录如下:

[2018-12-05 02:53:38] local.INFO: 从模型中获取用户[15]:Miss Lucile Langosh V  
[2018-12-05 02:53:38] local.INFO: 即将保存用户到数据库[15]学院君测试号15  
[2018-12-05 02:53:38] local.INFO: 即将更新用户到数据库[15]学院君测试号15  
[2018-12-05 02:53:38] local.INFO: 已经更新用户到数据库[15]学院君测试号15  
[2018-12-05 02:53:38] local.INFO: 已经保存用户到数据库[15]学院君测试号15

相关文章

  • laravel队列、消息通知和观察者模式的理解

    推荐设计模式-PHP观察者设计模式laravel事件监听--模型事件新特性深入了解laravel消费队列的两种工作...

  • laravel 通过观察者监听模型事件

    原文:https://laravelacademy.org/post/9713.html 所有支持的模型事件 在 ...

  • 事件驱动模型

    观察者模式与事件驱动模型 观察者模式: 事件驱动模型 2.事件驱动模型 事件源 持有监听器列表,或者各种类型监听器...

  • laravel事件

    Laravel 事件提供了简单的观察者模式实现,允许你订阅和监听应用中的事件。 事件和监听都是阻塞式应用,如果耗时...

  • laravel 之事件讲解

    Laravel 事件提供了简单的观察者模式实现,允许你订阅和监听应用中的事件。事件和监听都是阻塞式应用,如果耗时的...

  • laravel 模型事件监听

    所有支持的模型事件在 Eloquent 模型类上进行查询、插入、更新、删除操作时,会触发相应的模型事件(关于事件我...

  • Laravel 5.1 事件

    简介 Laravel事件提供了简单的观察者模式实现,允许你订阅和监听应用中的事件。事件类通常存放在app/Even...

  • 事件推送/监听

    先上代码: controller层 service层 事件监听 执行结果 该方法为观察者模式,通过事件发布,监听者...

  • laravel 基础教程 —— 事件

    事件 简介 laravel 的事件提供了一种简单的观察者实现。它允许你在应用中进行订阅和监听事件。事件类通常都是存...

  • Laravel 模型事件入门

    Laravel 模型事件允许你监听模型生命周期内的多个关键点,甚至可以在阻止一个模型的保存或者删除。 Larave...

网友评论

    本文标题:laravel 通过观察者监听模型事件

    本文链接:https://www.haomeiwen.com/subject/esaejqtx.html