搜索
首页php框架Laravel聊聊Laravel中模型事件怎么使用

聊聊Laravel中模型事件怎么使用

在使用 Eloquent 模型时,通常会利用通过模型生命周期调度的事件。有几种不同的方法可以做到这一点,在本教程中,我将介绍它们并解释每种方法的优缺点。【相关推荐:laravel视频教程

我将为每种方法使用相同的示例,以便你可以直接进行比较。此示例将在创建模型本身的过程中将模型的 UUID 属性分配给 UUID 。

我们的第一种方法使用模型的静态引导方法来注册行为。这使我们能够直接在模型上工作,并在模型为 created 。

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Office extends Model
{
    public static function boot(): void
    {
        static::creating(fn (Model $model) =>
            $model->uuid = Str::uuid(),
        );
    }
}

这种方法非常适合对模型事件的小而直接的反应,比如添加 UUID ,因为它非常容易理解,而且你可以准确地看到模型上正在发生的事情。这种方法最大的问题是代码重复,如果你有多个模型需要分配 UUID ,你将重复做相同的事情。

这很好地引导我们进入第二种方法,使用一个特征。在 Laravel 中,如果你在 trait 上创建一个以 boot 开头并以 trait 名称结尾的方法,你的模型可以继承 trait 并自动启动它们。这是一个例子:

declare(strict_types=1);

namespace App\Models\Concerns;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

trait HasUuid
{
    public static function bootHasUuid(): void
    {
        static::creating(fn (Model $model) =>
            $model->uuid = Str::uuid(),
        );
    }
}

使用特征允许你将此行为添加到需要它且易于实现的每个模型中。我最大的缺点是,当多个特征想要利用同一个模型事件时,堆叠这些行为可能会导致问题。他们开始争夺优先权,很快就会变得一团糟。

这将我们引向下一个选项,模型观察者。模型观察者是一种基于类的方法来响应模型事件,其中方法对应于被触发的特定事件。

declare(strict_types=1);

namespace App\Observers;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class OfficeObserver
{
    public function creating(Model $model): void
    {
        $model->uuid = Str::uuid();
    }
}

这个类需要在某个地方注册,在服务提供者或模型本身(这是我推荐的地方)。在模型中注册这个观察者可以在模型级别上看到改变雄辩行为的副作用。将其隐藏在服务提供商中的问题在于,除非每个人都知道它的存在,否则很难知道。这种方法的最大缺点是它的可见性。在我看来,正确使用这种方法非常棒。

解决此问题的另一种方法是利用 Eloquent 模型本身的$dispatchesEvents 属性。这是每个 Eloquent 模型上的一个属性,它允许你列出要侦听的事件以及为这些事件调用的类。

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class Office extends Model
{
    protected $dispatchesEvents = [
        'creating' => SetModelUuid::class,
    ];
}

SetModelUuid 将在 Eloquent 模型的生命周期中被实例化,这是你向模型添加行为和属性的机会。

declare(strict_types=1);

namespace App\Models\Events;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;

class SetModelUuid
{
    public function __construct(Model $model)
    {
        $model->uuid = Str::uuid();
    }
}

这种方法是最简洁和最容易理解的方法之一,因为模型有很多可见性,并且你可以轻松地在模型之间共享这个类。你将面临的最大问题是是否需要在模型事件上触发多个操作。

总之,老实说,没有正确的方法可以做到这一点。你可以选择上述任何一种方法,它们都会起作用,但你应该选择适合你和你的特定用例的方法。我希望看到有关此特定功能的更多选项。

例如,如果你需要在模型事件上向模型添加多个属性,则观察者是一个不错的选择。然而,这是最好的选择吗?如果我们使用 dispatch events 属性为该模型运行自定义管道会怎样?

declare(strict_types=1);

namespace App\Models\Pipelines;

use App\Models\Office

class OfficeCreatingPipeline
{
    public function __construct(Office $model)
    {
        app(Pipeline::class)
            ->send($model)
            ->through([
                ApplyUuidProperty::class,
                TapCreatedBy::class,
            ]);
    }
}

如你所见,我们可以开始使用管道来为事件建模添加多个行为。现在,这还没有经过测试,所以我不知道 100% 是否可行 - 但作为一个概念,它可以开辟一种可组合的方法来对模型事件做出反应。

你如何处理 Laravel 项目中的模型事件?在推特上告诉我们!

原文地址:https://laravel-news.com/working-with-laravel-model-events

译文地址:https://learnku.com/laravel/t/71183

更多编程相关知识,请访问:编程视频!!

以上是聊聊Laravel中模型事件怎么使用的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:learnku。如有侵权,请联系admin@php.cn删除
最新的Laravel版本是什么?最新的Laravel版本是什么?May 09, 2025 am 12:09 AM

截至2023年10月,Laravel的最新版本是10.x。1.Laravel10.x支持PHP8.1,提升了开发效率。2.Jetstream改进支持Livewire和Inertia.js,简化前端开发。3.EloquentORM增加全文搜索功能,提升数据处理性能。4.使用时需注意依赖包兼容性,并应用缓存优化性能。

Laravel迁移:数据库管理初学者指南Laravel迁移:数据库管理初学者指南May 09, 2025 am 12:07 AM

laravelmigrationsStreamLinedAtabasemagementbyByProvideversionControlforyourDatabaseschema.1)他们alloweryoutodefineandsharethertherteructureofyourdatabase,MakeiteAsyTomanageChangEsovertime.2)MigrationalageChangangeSovertime.2)MigrationScancanbeccanCanbeCreateDandRunusingsImplecommands,EnsurnistateTapeve

Laravel迁移:最佳编码指南Laravel迁移:最佳编码指南May 09, 2025 am 12:03 AM

Laravel的迁移系统是开发者进行数据库设计和管理的强大工具。1)确保迁移文件命名清晰明了,使用动词描述操作。2)考虑数据完整性和性能,如为字段添加唯一约束。3)使用事务处理确保数据库一致性。4)在迁移最后创建索引以优化性能。5)保持迁移的原子性,每个文件只包含一个逻辑操作。通过这些实践,可以编写高效、可维护的迁移代码。

最新的Laravel版本:与最新功能保持最新最新的Laravel版本:与最新功能保持最新May 09, 2025 am 12:03 AM

Laravel的最新版本是10.x,发布于2023年初。该版本带来增强的EloquentORM功能和简化的路由系统,提升了开发效率和性能,但升级时需谨慎测试以防引入问题。

掌握Laravel软删除:最佳实践和高级技术掌握Laravel软删除:最佳实践和高级技术May 08, 2025 am 12:25 AM

laravelsoftdeletesallow“删除” withoutremovingRecordSssfromtheDatabase.toimplement:1)usethesoftdeletdeleterationyourmodel.2)usewithtrashed()toincludesoft-deletedrecordsinquordsinquordsinquordsinquordsinquordsinquordsinquordsinquordsinquordsinquordsinquor sinecustomscopemscopemscopeslikeonlikeOnlikeOnlikeOnlikeOnlikeNiqueniendselline)

Laravel软删除:恢复和永久删除记录Laravel软删除:恢复和永久删除记录May 08, 2025 am 12:24 AM

在Laravel中,恢复被软删除的记录使用restore()方法,永久删除使用forceDelete()方法。1)恢复单个记录使用withTrashed()->find()->restore(),多个记录使用onlyTrashed()->restore()。2)永久删除单个记录使用withTrashed()->find()->forceDelete(),多个记录使用onlyTrashed()->forceDelete()。

当前的Laravel版本:今天下载和升级!当前的Laravel版本:今天下载和升级!May 08, 2025 am 12:22 AM

你应该下载并升级到最新的Laravel版本,因为它提供了增强的EloquentORM功能和新的路由特性,这些更新可以提高应用程序的效率和安全性。要升级,请按照以下步骤:1.备份当前应用程序,2.更新composer.json文件至最新版本,3.运行更新命令。虽然可能会遇到一些常见问题,如废弃函数和包兼容性,但通过参考文档和社区支持,这些问题都可以解决。

Laravel:我什么时候应该更新到最后一个版本?Laravel:我什么时候应该更新到最后一个版本?May 08, 2025 am 12:18 AM

youshouldupdateTothelateStlaravelversionwhentheBeneFitsClearlyOutweighTheCosts.1)newfeaturesandimprovementCanenhanceCarenHanceYourApplication.2)SecurityUpdatesArecrucialifvulnerabilitysareaddresse.3)

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)