文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Laravel模型事件和模型事件在Trait中如何使用

2023-07-05 09:49

关注

这篇文章主要介绍“Laravel模型事件和模型事件在Trait中如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Laravel模型事件和模型事件在Trait中如何使用”文章能帮助大家解决问题。

模型事件

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

事件类型

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

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

boot 方法和事件注册

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

<?phpClass 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 来做到这一点:

<?phpnamespace 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&rsquo;s the magic. Happy coding.

关于“Laravel模型事件和模型事件在Trait中如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯