這篇“Laravel模型事件如何使用”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Laravel模型事件如何使用”文章吧。
創(chuàng)新互聯(lián)是一家專業(yè)提供劍河企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、html5、小程序制作等業(yè)務(wù)。10年已為劍河眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進(jìn)行中。
我們的第一種方法使用模型的靜態(tài)引導(dǎo)方法來注冊行為。這使我們能夠直接在模型上工作,并在模型為 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(),
);
}
}
這種方法非常適合對模型事件的小而直接的反應(yīng),比如添加 UUID ,因?yàn)樗浅H菀桌斫?,而且你可以?zhǔn)確地看到模型上正在發(fā)生的事情。這種方法最大的問題是代碼重復(fù),如果你有多個(gè)模型需要分配 UUID ,你將重復(fù)做相同的事情。
這很好地引導(dǎo)我們進(jìn)入第二種方法,使用一個(gè)特征。在 Laravel 中,如果你在 trait 上創(chuàng)建一個(gè)以 boot
開頭并以 trait 名稱結(jié)尾的方法,你的模型可以繼承 trait 并自動(dòng)啟動(dòng)它們。這是一個(gè)例子:
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(),
);
}
}
使用特征允許你將此行為添加到需要它且易于實(shí)現(xiàn)的每個(gè)模型中。我最大的缺點(diǎn)是,當(dāng)多個(gè)特征想要利用同一個(gè)模型事件時(shí),堆疊這些行為可能會(huì)導(dǎo)致問題。他們開始爭奪優(yōu)先權(quán),很快就會(huì)變得一團(tuán)糟。
這將我們引向下一個(gè)選項(xiàng),模型觀察者。模型觀察者是一種基于類的方法來響應(yīng)模型事件,其中方法對應(yīng)于被觸發(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();
}
}
這個(gè)類需要在某個(gè)地方注冊,在服務(wù)提供者或模型本身(這是我推薦的地方)。在模型中注冊這個(gè)觀察者可以在模型級別上看到改變雄辯行為的副作用。將其隱藏在服務(wù)提供商中的問題在于,除非每個(gè)人都知道它的存在,否則很難知道。這種方法的最大缺點(diǎn)是它的可見性。在我看來,正確使用這種方法非常棒。
解決此問題的另一種方法是利用 Eloquent 模型本身的$dispatchesEvents
屬性。這是每個(gè) Eloquent 模型上的一個(gè)屬性,它允許你列出要偵聽的事件以及為這些事件調(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 模型的生命周期中被實(shí)例化,這是你向模型添加行為和屬性的機(jī)會(huì)。
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();
}
}
這種方法是最簡潔和最容易理解的方法之一,因?yàn)槟P陀泻芏嗫梢娦裕⑶夷憧梢暂p松地在模型之間共享這個(gè)類。你將面臨的最大問題是是否需要在模型事件上觸發(fā)多個(gè)操作。
總之,老實(shí)說,沒有正確的方法可以做到這一點(diǎn)。你可以選擇上述任何一種方法,它們都會(huì)起作用,但你應(yīng)該選擇適合你和你的特定用例的方法。我希望看到有關(guān)此特定功能的更多選項(xiàng)。
例如,如果你需要在模型事件上向模型添加多個(gè)屬性,則觀察者是一個(gè)不錯(cuò)的選擇。然而,這是最好的選擇嗎?如果我們使用 dispatch events 屬性為該模型運(yùn)行自定義管道會(huì)怎樣?
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,
]);
}
}
如你所見,我們可以開始使用管道來為事件建模添加多個(gè)行為?,F(xiàn)在,這還沒有經(jīng)過測試,所以我不知道 100% 是否可行 - 但作為一個(gè)概念,它可以開辟一種可組合的方法來對模型事件做出反應(yīng)。
以上就是關(guān)于“Laravel模型事件如何使用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。