广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >详解Laravel模型事件和模型事件在Trait中的使用
  • 477
分享到

详解Laravel模型事件和模型事件在Trait中的使用

Laravel模型事件TraitLaravel Trait 2023-03-07 17:03:41 477人浏览 安东尼
摘要

目录模型事件事件类型boot 方法和事件注册boot 在 traits 中的使用boot(启动) 和 initialize(初始化)Boot(启动)Initialize (初始化)模

模型事件

Laravel 模型事件允许你监听模型生命周期内的事件, 并且通过这个事件去做一些模型通用性的东西, 例如检查用户修改了那个字段, 将字段的什么值修改成另外的什么值, 等等.

事件类型

# 当现有模型被数据库检索时
retrieved
# 当一个新的模型被第一次保存时
creating
created
# 对一个已经存在于数据库的模型调用 save 方法
updating
updated
# 当模型数据被删除时
deleting
deleted
# 当创建和更新执行时都会调用
saving
saved
# 当启用软删除的数据被恢复时
restoring
restored
# 当启用软删除的数据被强制删除时
forceDeleted
# 复制
replicating
# 指定模型的指定事件被触发时(注意 $name 前有个空格)
# event 对应以上的事件类型
# name 对应的是模型的类名称
eloquent.{$event}: {$name}

以上事件类型的注册可以通过 boot 方法注册

boot 方法和事件注册

模型在执行时候仅仅执行一次的 boot 方法, 可以理解为模型启动时候的注册钩子方法我们看下示例

<?PHP
Class PaMaccount extend Model
{
    public static function boot()
    {
        parent::boot();
        self::deleting(function ($user){
            if (!method_exists((new static::class), 'bootSoftDeletes')) {
                $user->roles()->sync([]);
            }
            return true;
        });
    }
}

这里注册了一个事件, 这个事件的目的是在删除的时候(如果不是软删除) 删除角色信息, 这里注册的是一个 deleting方法, 使用的方式是 self::deleting($cb) 这个函数, 除此之外其他的事件也都有相对应的方法.

boot 在 traits 中的使用

假如有一个场景我们需要再多个模型中均需要注册同样的操作, 我们是否需要再多个模型中编写重复的代码呢 ? 答案是不需要, 因为 Trait 也提供了相关的方法来进行注册/初始化, 在 Model.php 中可以发现如下定义

protected static function boot()
{
    static::bootTraits();
}

这里的意思是在运行 boot 方法的时候同时注册相关 Traits 方法, 这也是 Eloquent ORM 的优势之一, 当使用 Eloquent 时,可以执行 Trait 注册逻辑。

boot 方法非常_神奇_,因为可以将 trait 附加到模型,如果在 trait 上设置一些方法,这些方法将在开始使用模型时调用。它们遵循如下格式 : boot{Trait}initialize{Trait},允许在多个模型中重用相同的代码。

boot(启动) 和 initialize(初始化)

两者的区别很简单:boot静态执行 ,而 initialize动态执行。 boot 影响模型的所有实例,而 initialize 将仅对其实例起作用。

为了更好地举例说明这些是如何工作的,让我们创建一个名为HasToken的 trait. 这个 trait 在给定的 Eloquent 模型上有两个任务。

  • 创建模型时添加事件以记录谁插入了记录
  • 将随机字符串作为标记添加到模型中

第一项任务是了解经过身份验证的用户创建了新模型。第二个将允许模型自动创建一个随机令牌,以避免在我们应用程序的多个位置手动创建它。

我们可以使用单个 trait 来做到这一点:

<?php
namespace App;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
trait HasToken
{
    
    protected function bootHasToken()
    {
        static::created(function ($model) {
            // Log who created this model
            Log::info('Token for ' . class_basename($model) . ' created by ' . Auth::user()->geTKEy());
        });
    }
    
    protected function initializeHasToken()
    {
        // Automatically create a random token
        $this->token = Str::random(100);
    }
}

Boot(启动)

boot 方法将在静态模型上工作。例如,如果将此 trait 添加到 Authentication 模型中,则使用此方法所做的一切都会以静态的方式影响该模型 > 方法名称必须遵循该boot{TraitName}格式

这对于向 eloquent 事件添加回调非常方便,例如creatingretrieving,因为这些事件是静态的。


protected function bootHasToken()
{
    static::created(function ($model) {
        // Log who created this model
        Log::info('Token for ' . 
            class_basename($model) . 
           ' created by ' . 
           Auth::user()->getKey()
        );
    });
}

这是一个非常棒的想法:启动模型不会执行两次,仅在需要时进行。无需担心 bootHasToken() 多次调用该方法,Eloquent ORM 模型会持续跟踪启动的模型

Initialize (初始化)

我们可以使用 boot 方法做静态级的事情,但是要操作模型实例本身,我们需要使用初始化方法。可以使用该initialize{Trait}格式创建初始化程序。


protected function initializeHasToken()
{
    // Automatically create a random token
    $this->token = Str::random(100);
}

每次实例化新模型时都会运行初始化方法. And that’s the magic. Happy coding.

参考 Laravel: Booting and Initializing Models with traits

以上就是详解Laravel模型事件和模型事件在Trait中的使用的详细内容,更多关于Laravel模型事件Trait的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解Laravel模型事件和模型事件在Trait中的使用

本文链接: https://www.lsjlt.com/news/198892.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Laravel模型事件和模型事件在Trait中的使用
    目录模型事件事件类型boot 方法和事件注册boot 在 traits 中的使用boot(启动) 和 initialize(初始化)Boot(启动)Initialize (初始化)模...
    99+
    2023-03-07
    Laravel模型事件Trait Laravel Trait
  • Laravel模型事件和模型事件在Trait中如何使用
    这篇文章主要介绍“Laravel模型事件和模型事件在Trait中如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel模型事件和模型事件在Trait中如何使用”文章能帮助大家解决问题。...
    99+
    2023-07-05
  • Laravel模型事件如何使用
    这篇“Laravel模型事件如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Laravel模型事件如何使用”文章吧。我...
    99+
    2023-07-04
  • Java设计模式的事件模型详解
    目录监听模式参与的角色事件、事件源、监听器之间的关系举个粒子总结监听模式 事件模型实现了监听模式,监听模式简单来说就是事件源经过事件的封装传给监听器,当事件源触发事件后,监听器接收到...
    99+
    2022-11-13
  • 详解JS浏览器事件模型
    目录什么是事件一个简单的例子如何绑定事件框架中的事件事件对象事件传播事件代理总结什么是事件 我想你很可能听说过事件驱动, 但是事件驱动到底是什么?为什么说浏览器是事件驱动的呢? 事件...
    99+
    2022-11-12
  • javascript中的事件模型是什么
    本篇内容主要讲解“javascript中的事件模型是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javascript中的事件模型是什么”吧! ...
    99+
    2022-10-19
  • JS中事件绑定、事件流模型的示例分析
    小编给大家分享一下JS中事件绑定、事件流模型的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 一、JS事件(一...
    99+
    2022-10-19
  • java中的事件处理模型是什么
    java中的事件处理模型是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queue...
    99+
    2023-06-14
  • Redis中事件驱动模型的作用是什么
    这篇文章给大家介绍Redis中事件驱动模型的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。前言Redis 是一个事件驱动的内存数据库,服务器需要处理两种类型的事件。文件事件时...
    99+
    2022-10-18
  • Node.js中使用事件发射器模式实现事件绑定详解
    在Node里,很多对象都会发射事件。比如,一个TCP服务器,每当有客户端请求连接就会发射“connect”事件,又比如,每当读取一整块数据,文件系统就会发射一个“data”事件。这些对象在Node里被称为事...
    99+
    2022-06-04
    事件 发射器 绑定
  • Node的事件处理和readline模块详解
    目录一、Node的事件处理二、通过Node的readline模块实现终端的输入总结一、Node的事件处理 1、采用事件驱动模型 2、Node是单线程的,采用事件轮询方式来处理事件 3...
    99+
    2022-11-13
  • 如何实现观察者模式及Spring中的事件编程模型
    这篇“如何实现观察者模式及Spring中的事件编程模型”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来...
    99+
    2022-10-19
  • node中socket.io的事件使用详解
    socket.io类库不但可以相互发送消息,而且还可以通过socket端口对象的emit方法互相发送事件. emit在之前的事件上说过现在一句话带过:emit是用来手动触发事件的. socket.emit...
    99+
    2022-06-04
    详解 事件 node
  • Node.js中的events事件模块怎么使用
    本篇内容主要讲解“Node.js中的events事件模块怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js中的events事件模块怎么使用”吧...
    99+
    2022-10-19
  • HTML中使用盒模型的注意事项有哪些
    这篇文章将为大家详细讲解有关HTML中使用盒模型的注意事项有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。关于怪异盒模型和标准盒模型的对比关于怪异盒模型盒标准盒模型之...
    99+
    2022-10-19
  • JavaScript中BOM,DOM和事件的用法详解
    目录BOM概念对象组成Window:窗口对象Location:地址栏对象History:历史记录对象DOM概念W3C DOM 标准被分为 3 个不同的部分核心DOM模型HTML DO...
    99+
    2022-11-13
  • 详解Vue3中Watch监听事件的使用
    目录一、watch的使用1、引入watch2、多个数据源监听3、监听数组变化4、侦听对象5、结论一、watch的使用 watch(WatcherSource, Callback, [...
    99+
    2023-02-10
    Vue3 Watch监听事件使用 Vue3 Watch监听 Vue3 Watch
  • NodejsBuffer的使用及Stream流和事件机制详解
    目录前言Buffer 使用Buffer 拼接编码问题拼接的正确姿势文件读取性能在网络中的应用流 Stream管道 pipe()EventEmitter总结前言 昨天我们讲述了 Buf...
    99+
    2022-11-13
    Nodejs Buffer Stream流 Nodejs 事件机制
  • Vue中事件总线(eventBus)的深入详解及使用
    目录1. 简介2. 使用安装及引入在组件中使用补充:移除监听事件总结1. 简介 Vue 组件中常见的有:父子组件通信、兄弟组件通信。而父子组件通信就很简单,父组件会通过 props ...
    99+
    2022-11-13
  • 基于Pydantic封装的通用模型在API请求验证中的应用详解
    目录引言通用modelMixin 模式组合模式结论杂谈引言 Pydantic 是一个用于数据验证和解析的流行库,经常被用于 FastAPI 和其他现代 Python 项目中。在处理 ...
    99+
    2023-05-18
    Pydantic封装API请求验证 Pydantic通用模型封装
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作