您好,登錄后才能下訂單哦!
這篇文章主要介紹“Laravel模型事件和模型事件在Trait中如何使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Laravel模型事件和模型事件在Trait中如何使用”文章能幫助大家解決問題。
Laravel 模型事件允許你監(jiān)聽模型生命周期內的事件, 并且通過這個事件去做一些模型通用性的東西, 例如檢查用戶修改了那個字段, 將字段的什么值修改成另外的什么值, 等等.
# 當現(xiàn)有模型被數(shù)據(jù)庫檢索時 retrieved # 當一個新的模型被第一次保存時 creating created # 對一個已經(jīng)存在于數(shù)據(jù)庫的模型調用 save 方法 updating updated # 當模型數(shù)據(jù)被刪除時 deleting deleted # 當創(chuàng)建和更新執(zhí)行時都會調用 saving saved # 當啟用軟刪除的數(shù)據(jù)被恢復時 restoring restored # 當啟用軟刪除的數(shù)據(jù)被強制刪除時 forceDeleted # 復制 replicating # 指定模型的指定事件被觸發(fā)時(注意 $name 前有個空格) # event 對應以上的事件類型 # name 對應的是模型的類名稱 eloquent.{$event}: {$name}
以上事件類型的注冊可以通過 boot 方法注冊
模型在執(zhí)行時候僅僅執(zhí)行一次的 boot 方法, 可以理解為模型啟動時候的注冊鉤子方法我們看下示例
<?php Class 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)
這個函數(shù), 除此之外其他的事件也都有相對應的方法.
假如有一個場景我們需要再多個模型中均需要注冊同樣的操作, 我們是否需要再多個模型中編寫重復的代碼呢 ? 答案是不需要, 因為 Trait
也提供了相關的方法來進行注冊/初始化, 在 Model.php
中可以發(fā)現(xiàn)如下定義
protected static function boot() { static::bootTraits(); }
這里的意思是在運行 boot
方法的時候同時注冊相關 Traits
方法, 這也是 Eloquent ORM 的優(yōu)勢之一, 當使用 Eloquent 時,可以執(zhí)行 Trait 注冊邏輯。
boot
方法非常_神奇_,因為可以將 trait 附加到模型,如果在 trait 上設置一些方法,這些方法將在開始使用模型時調用。它們遵循如下格式 : boot{Trait}
和 initialize{Trait}
,允許在多個模型中重用相同的代碼。
兩者的區(qū)別很簡單:boot
靜態(tài)執(zhí)行 ,而 initialize
動態(tài)執(zhí)行。 boot
影響模型的所有實例,而 initialize
將僅對其實例起作用。
為了更好地舉例說明這些是如何工作的,讓我們創(chuàng)建一個名為HasToken
的 trait. 這個 trait 在給定的 Eloquent 模型上有兩個任務。
創(chuàng)建模型時添加事件以記錄誰插入了記錄
將隨機字符串作為標記添加到模型中
第一項任務是了解經(jīng)過身份驗證的用戶創(chuàng)建了新模型。第二個將允許模型自動創(chuàng)建一個隨機令牌,以避免在我們應用程序的多個位置手動創(chuàng)建它。
我們可以使用單個 trait 來做到這一點:
<?php namespace App; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Str; trait HasToken { /** * Boot the trait * * @return void */ protected function bootHasToken() { static::created(function ($model) { // Log who created this model Log::info('Token for ' . class_basename($model) . ' created by ' . Auth::user()->getKey()); }); } /** * Initialize the trait * * @return void */ protected function initializeHasToken() { // Automatically create a random token $this->token = Str::random(100); } }
boot 方法將在靜態(tài)模型上工作。例如,如果將此 trait 添加到 Authentication
模型中,則使用此方法所做的一切都會以靜態(tài)的方式影響該模型 > 方法名稱必須遵循該boot{TraitName}
格式
這對于向 eloquent 事件添加回調非常方便,例如creating
或retrieving
,因為這些事件是靜態(tài)的。
/** * Boot the trait * * @return void */ protected function bootHasToken() { static::created(function ($model) { // Log who created this model Log::info('Token for ' . class_basename($model) . ' created by ' . Auth::user()->getKey() ); }); }
這是一個非常棒的想法:啟動模型不會執(zhí)行兩次,僅在需要時進行。無需擔心 bootHasToken()
多次調用該方法,Eloquent ORM 模型會持續(xù)跟蹤啟動的模型
我們可以使用 boot 方法做靜態(tài)級的事情,但是要操作模型實例本身,我們需要使用初始化方法??梢允褂迷?code>initialize{Trait}格式創(chuàng)建初始化程序。
/** * Initialize the trait * * @return void */ protected function initializeHasToken() { // Automatically create a random token $this->token = Str::random(100); }
每次實例化新模型時都會運行初始化方法. And that’s the magic. Happy coding.
關于“Laravel模型事件和模型事件在Trait中如何使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識,可以關注億速云行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。