微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Laravel模型事件如何使用

这篇“Laravel模型事件如何使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Laravel模型事件如何使用”文章吧。

我们的第一种方法使用模型的静态引导方法注册行为。这使我们能够直接在模型上工作,并在模型为 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模型事件如何使用”这篇文章内容,相信大家都有了一定的了解,希望小编分享内容对大家有帮助,若想了解更多相关的知识内容,请关注编程之家行业资讯频道。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐