91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

Laravel模型事件和模型事件在Trait中如何使用

發布時間:2023-03-08 10:06:14 來源:億速云 閱讀:116 作者:iii 欄目:開發技術

這篇文章主要介紹“Laravel模型事件和模型事件在Trait中如何使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Laravel模型事件和模型事件在Trait中如何使用”文章能幫助大家解決問題。

模型事件

Laravel 模型事件允許你監聽模型生命周期內的事件, 并且通過這個事件去做一些模型通用性的東西, 例如檢查用戶修改了那個字段, 將字段的什么值修改成另外的什么值, 等等.

事件類型

# 當現有模型被數據庫檢索時
retrieved
# 當一個新的模型被第一次保存時
creating
created
# 對一個已經存在于數據庫的模型調用 save 方法
updating
updated
# 當模型數據被刪除時
deleting
deleted
# 當創建和更新執行時都會調用
saving
saved
# 當啟用軟刪除的數據被恢復時
restoring
restored
# 當啟用軟刪除的數據被強制刪除時
forceDeleted
# 復制
replicating
# 指定模型的指定事件被觸發時(注意 $name 前有個空格)
# event 對應以上的事件類型
# name 對應的是模型的類名稱
eloquent.{$event}: {$name}

以上事件類型的注冊可以通過 boot 方法注冊

boot 方法和事件注冊

模型在執行時候僅僅執行一次的 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) 這個函數, 除此之外其他的事件也都有相對應的方法.

boot 在 traits 中的使用

假如有一個場景我們需要再多個模型中均需要注冊同樣的操作, 我們是否需要再多個模型中編寫重復的代碼呢 ? 答案是不需要, 因為 Trait 也提供了相關的方法來進行注冊/初始化, 在 Model.php 中可以發現如下定義

protected static function boot()
{
    static::bootTraits();
}

這里的意思是在運行 boot 方法的時候同時注冊相關 Traits 方法, 這也是 Eloquent ORM 的優勢之一, 當使用 Eloquent 時,可以執行 Trait 注冊邏輯。

boot 方法非常_神奇_,因為可以將 trait 附加到模型,如果在 trait 上設置一些方法,這些方法將在開始使用模型時調用。它們遵循如下格式 : boot{Trait}initialize{Trait},允許在多個模型中重用相同的代碼。

boot(啟動) 和 initialize(初始化)

兩者的區別很簡單:boot靜態執行 ,而 initialize動態執行。 boot 影響模型的所有實例,而 initialize 將僅對其實例起作用。

為了更好地舉例說明這些是如何工作的,讓我們創建一個名為HasToken的 trait. 這個 trait 在給定的 Eloquent 模型上有兩個任務。

  • 創建模型時添加事件以記錄誰插入了記錄

  • 將隨機字符串作為標記添加到模型中

第一項任務是了解經過身份驗證的用戶創建了新模型。第二個將允許模型自動創建一個隨機令牌,以避免在我們應用程序的多個位置手動創建它。

我們可以使用單個 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(啟動)

boot 方法將在靜態模型上工作。例如,如果將此 trait 添加到 Authentication 模型中,則使用此方法所做的一切都會以靜態的方式影響該模型 > 方法名稱必須遵循該boot{TraitName}格式

這對于向 eloquent 事件添加回調非常方便,例如creatingretrieving,因為這些事件是靜態的。

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

這是一個非常棒的想法:啟動模型不會執行兩次,僅在需要時進行。無需擔心 bootHasToken() 多次調用該方法,Eloquent ORM 模型會持續跟蹤啟動的模型

Initialize (初始化)

我們可以使用 boot 方法做靜態級的事情,但是要操作模型實例本身,我們需要使用初始化方法。可以使用該initialize{Trait}格式創建初始化程序。

/**
 * Initialize the trait
 *
 * @return void
 */
protected function initializeHasToken()
{
    // Automatically create a random token
    $this->token = Str::random(100);
}

每次實例化新模型時都會運行初始化方法. And that&rsquo;s the magic. Happy coding.

關于“Laravel模型事件和模型事件在Trait中如何使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

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

AI

乐陵市| 石景山区| 泸溪县| 来安县| 米易县| 休宁县| 兴山县| 龙门县| 工布江达县| 孟州市| 延寿县| 饶阳县| 静宁县| 尉犁县| 白朗县| 金门县| 延边| 屏东市| 晋宁县| 武鸣县| 平遥县| 石门县| 大兴区| 响水县| 泾源县| 金坛市| 炎陵县| 承德市| 海宁市| 钟祥市| 库车县| 高安市| 湾仔区| 和顺县| 庆元县| 五寨县| 大连市| 澄城县| 桐梓县| 磴口县| 阿拉善盟|