溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Laravel模型事件如何使用

發(fā)布時間:2022-12-27 09:03:22 來源:億速云 閱讀:146 作者:iii 欄目:編程語言

這篇“Laravel模型事件如何使用”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Laravel模型事件如何使用”文章吧。

我們的第一種方法使用模型的靜態(tài)引導方法來注冊行為。這使我們能夠直接在模型上工作,并在模型為 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 ,因為它非常容易理解,而且你可以準確地看到模型上正在發(fā)生的事情。這種方法最大的問題是代碼重復,如果你有多個模型需要分配 UUID ,你將重復做相同的事情。

這很好地引導我們進入第二種方法,使用一個特征。在 Laravel 中,如果你在 trait 上創(chuàng)建一個以 boot 開頭并以 trait 名稱結(jié)尾的方法,你的模型可以繼承 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(),
        );
    }
}

使用特征允許你將此行為添加到需要它且易于實現(xiàn)的每個模型中。我最大的缺點是,當多個特征想要利用同一個模型事件時,堆疊這些行為可能會導致問題。他們開始爭奪優(yōu)先權,很快就會變得一團糟。

這將我們引向下一個選項,模型觀察者。模型觀察者是一種基于類的方法來響應模型事件,其中方法對應于被觸發(fā)的特定事件。

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 模型上的一個屬性,它允許你列出要偵聽的事件以及為這些事件調(diào)用的類。

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();
    }
}

這種方法是最簡潔和最容易理解的方法之一,因為模型有很多可見性,并且你可以輕松地在模型之間共享這個類。你將面臨的最大問題是是否需要在模型事件上觸發(fā)多個操作。

總之,老實說,沒有正確的方法可以做到這一點。你可以選擇上述任何一種方法,它們都會起作用,但你應該選擇適合你和你的特定用例的方法。我希望看到有關此特定功能的更多選項。

例如,如果你需要在模型事件上向模型添加多個屬性,則觀察者是一個不錯的選擇。然而,這是最好的選擇嗎?如果我們使用 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,
            ]);
    }
}

如你所見,我們可以開始使用管道來為事件建模添加多個行為?,F(xiàn)在,這還沒有經(jīng)過測試,所以我不知道 100% 是否可行 - 但作為一個概念,它可以開辟一種可組合的方法來對模型事件做出反應。

以上就是關于“Laravel模型事件如何使用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關的知識內(nèi)容,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI