詳解Laravel模型事件和模型事件在Trait中的使用
模型事件
Laravel 模型事件允許你監(jiān)聽(tīng)模型生命周期內(nèi)的事件, 并且通過(guò)這個(gè)事件去做一些模型通用性的東西, 例如檢查用戶(hù)修改了那個(gè)字段, 將字段的什么值修改成另外的什么值, 等等.
事件類(lèi)型
# 當(dāng)現(xiàn)有模型被數(shù)據(jù)庫(kù)檢索時(shí)
retrieved
# 當(dāng)一個(gè)新的模型被第一次保存時(shí)
creating
created
# 對(duì)一個(gè)已經(jīng)存在于數(shù)據(jù)庫(kù)的模型調(diào)用 save 方法
updating
updated
# 當(dāng)模型數(shù)據(jù)被刪除時(shí)
deleting
deleted
# 當(dāng)創(chuàng)建和更新執(zhí)行時(shí)都會(huì)調(diào)用
saving
saved
# 當(dāng)啟用軟刪除的數(shù)據(jù)被恢復(fù)時(shí)
restoring
restored
# 當(dāng)啟用軟刪除的數(shù)據(jù)被強(qiáng)制刪除時(shí)
forceDeleted
# 復(fù)制
replicating
# 指定模型的指定事件被觸發(fā)時(shí)(注意 $name 前有個(gè)空格)
# event 對(duì)應(yīng)以上的事件類(lèi)型
# name 對(duì)應(yīng)的是模型的類(lèi)名稱(chēng)
eloquent.{$event}: {$name}
以上事件類(lèi)型的注冊(cè)可以通過(guò) boot 方法注冊(cè)
boot 方法和事件注冊(cè)
模型在執(zhí)行時(shí)候僅僅執(zhí)行一次的 boot 方法, 可以理解為模型啟動(dòng)時(shí)候的注冊(cè)鉤子方法我們看下示例
<?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;
});
}
}
這里注冊(cè)了一個(gè)事件, 這個(gè)事件的目的是在刪除的時(shí)候(如果不是軟刪除) 刪除角色信息, 這里注冊(cè)的是一個(gè) deleting方法, 使用的方式是 self::deleting($cb) 這個(gè)函數(shù), 除此之外其他的事件也都有相對(duì)應(yīng)的方法.
boot 在 traits 中的使用
假如有一個(gè)場(chǎng)景我們需要再多個(gè)模型中均需要注冊(cè)同樣的操作, 我們是否需要再多個(gè)模型中編寫(xiě)重復(fù)的代碼呢 ? 答案是不需要, 因?yàn)?Trait 也提供了相關(guān)的方法來(lái)進(jìn)行注冊(cè)/初始化, 在 Model.php 中可以發(fā)現(xiàn)如下定義
protected static function boot()
{
static::bootTraits();
}
這里的意思是在運(yùn)行 boot 方法的時(shí)候同時(shí)注冊(cè)相關(guān) Traits 方法, 這也是 Eloquent ORM 的優(yōu)勢(shì)之一, 當(dāng)使用 Eloquent 時(shí),可以執(zhí)行 Trait 注冊(cè)邏輯。
boot 方法非常_神奇_,因?yàn)榭梢詫?trait 附加到模型,如果在 trait 上設(shè)置一些方法,這些方法將在開(kāi)始使用模型時(shí)調(diào)用。它們遵循如下格式 : boot{Trait} 和 initialize{Trait},允許在多個(gè)模型中重用相同的代碼。
boot(啟動(dòng)) 和 initialize(初始化)
兩者的區(qū)別很簡(jiǎn)單:boot靜態(tài)執(zhí)行 ,而 initialize動(dòng)態(tài)執(zhí)行。 boot 影響模型的所有實(shí)例,而 initialize 將僅對(duì)其實(shí)例起作用。
為了更好地舉例說(shuō)明這些是如何工作的,讓我們創(chuàng)建一個(gè)名為HasToken的 trait. 這個(gè) trait 在給定的 Eloquent 模型上有兩個(gè)任務(wù)。
- 創(chuàng)建模型時(shí)添加事件以記錄誰(shuí)插入了記錄
- 將隨機(jī)字符串作為標(biāo)記添加到模型中
第一項(xiàng)任務(wù)是了解經(jīng)過(guò)身份驗(yàn)證的用戶(hù)創(chuàng)建了新模型。第二個(gè)將允許模型自動(dòng)創(chuàng)建一個(gè)隨機(jī)令牌,以避免在我們應(yīng)用程序的多個(gè)位置手動(dòng)創(chuàng)建它。
我們可以使用單個(gè) trait 來(lái)做到這一點(diǎn):
<?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(啟動(dòng))
boot 方法將在靜態(tài)模型上工作。例如,如果將此 trait 添加到 Authentication 模型中,則使用此方法所做的一切都會(huì)以靜態(tài)的方式影響該模型 > 方法名稱(chēng)必須遵循該boot{TraitName}格式
這對(duì)于向 eloquent 事件添加回調(diào)非常方便,例如creating或retrieving,因?yàn)檫@些事件是靜態(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()
);
});
}
這是一個(gè)非常棒的想法:?jiǎn)?dòng)模型不會(huì)執(zhí)行兩次,僅在需要時(shí)進(jìn)行。無(wú)需擔(dān)心 bootHasToken() 多次調(diào)用該方法,Eloquent ORM 模型會(huì)持續(xù)跟蹤啟動(dòng)的模型
Initialize (初始化)
我們可以使用 boot 方法做靜態(tài)級(jí)的事情,但是要操作模型實(shí)例本身,我們需要使用初始化方法??梢允褂迷?code>initialize{Trait}格式創(chuàng)建初始化程序。
/**
* Initialize the trait
*
* @return void
*/
protected function initializeHasToken()
{
// Automatically create a random token
$this->token = Str::random(100);
}
每次實(shí)例化新模型時(shí)都會(huì)運(yùn)行初始化方法. And that’s the magic. Happy coding.
參考 Laravel: Booting and Initializing Models with traits
以上就是詳解Laravel模型事件和模型事件在Trait中的使用的詳細(xì)內(nèi)容,更多關(guān)于Laravel模型事件Trait的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
PHPCMS手機(jī)站偽靜態(tài)設(shè)置詳細(xì)教程
這篇文章主要介紹了PHPCMS手機(jī)站偽靜態(tài)設(shè)置教程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-02-02
PHP?ceil()函數(shù)浮點(diǎn)數(shù)向上取整實(shí)現(xiàn)示例
這篇文章主要為大家介紹了PHP?ceil()函數(shù)實(shí)現(xiàn)浮點(diǎn)數(shù)向上取整示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01
php使用ICQ網(wǎng)關(guān)發(fā)送手機(jī)短信
php發(fā)送手機(jī)短信實(shí)例代碼。2013-10-10
基于thinkphp6.0的success、error實(shí)現(xiàn)方法
這篇文章主要介紹了基于thinkphp6.0的success、error實(shí)現(xiàn)方法,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11
php筆記之:有規(guī)律大文件的讀取與寫(xiě)入的分析
本篇文章介紹了,php有規(guī)律大文件的讀取與寫(xiě)入的分析。需要的朋友參考下2013-04-04
PHP會(huì)員找回密碼功能的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇PHP會(huì)員找回密碼功能的簡(jiǎn)單實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09

