laravel 訪問器的使用場景、方法和格式詳解
阿新 • • 發佈:2020-08-07
在laravel中,如果你想修改某個欄位的顯示格式,比如這種情況:資料庫表中的欄位是 性別 0 或 1 0表示男 1表示女 , 這個時候你查詢出來的資料就會顯示為0 或者 1,一眼無法讓別人分辨出是男還是女,所以為了讓別人一眼能知道,就要做些調整,比如在模板中進行判斷,
if(sex=='1') echo '男' else echo '女';
這樣也是可以的,但會增加模板的複雜性,不利於維護,laravel為我們提供了一種解決方法——訪問器,它的作用就是將我們寫在模板中的那些判斷給分離出來,達到的效果和在模板中寫判斷是一樣的,只不過分離出來了,更加利於維護。
1、訪問器寫在哪兒?
寫在與之對應的模型類中。
2、格式和寫法(這裡介紹四種寫法)
/**
* 資料庫欄位: is_menu 該欄位存的是1或者0 1代表 是 0代表 否
* 訪問器 函式的命名規則 get +駝峰命名+ Attribute
* 訪問器不僅僅用在 模板呼叫中的顯示,其他地方也可以呼叫,這裡只介紹配合模板的使用
*/
//前兩種 在函式中引數傳值
//後兩種不通過引數傳值,通過其他方式獲得值
//第一種 引數傳值
//注意事項:駝峰式命名,資料庫欄位為is_menu 則函式名要改為getISMenuAttribute
//$key 是從資料庫取出的值,為1或者0 $key 進行修飾,從而得到我們想要的格式
//在模板中呼叫顯示該欄位時,依舊與資料庫欄位保持相同即可,即使用$item->is_menu
//只是經過訪問器的修飾後不會再顯示為0或者1了,而是會顯示為 是 或者 否
public function getISMenuAttribute($key)
{
//如果取出的$key 為1 則顯示 是 否則 顯示 否
return $key== "1" ? "<span class=\"label label-success radius\">是</span>" : '<span class="label label-default radius">否</span>';
}
//第二種 引數傳值
//可以自定義在模板中呼叫的名稱
//比如,我依然對is_menu欄位進行修飾顯示
//函式名除了第一種命名方式,還可以自定義,如寫成這樣:get +Menu+ Attribute
//如果依舊使用$item->is_menu,則會顯示1或者0,即原樣輸出,沒有修飾格式,沒有達到我們需求
//此時在模板中呼叫顯示該欄位時, 不能 與資料庫欄位保持相同,而要用$item->menu
public function getMenuAttribute($key)
{
//如果取出的$key 為1 則顯示 是 否則 顯示 否
return $key== "1" ? "<span class=\"label label-success radius\">是</span>" : '<span class="label label-default radius">否</span>';
}
//第三種 不通過引數傳值
//前兩種方法,是在函式名以及呼叫上有區別
//第三種,在函式名上與第一種沒區別,但是 函式沒有引數了
//請注意,此時是通過$this->attributes['is_menu']拿到從資料庫中取出的值的,而不是像前兩種那樣通過傳參得到的值
//特別注意:若採用與資料庫欄位相呼應的駝峰式命名函式名,且不傳引數的情況下,是那麼不能通過$this->is_menu獲得值,
//會報錯ErrorException (E_ERROR)Undefined property:...
//只能通過$this->attributes['is_menu']拿到值
public function getIsMenuAttribute()
{
return $this->attributes['is_menu']."aaa";
}
//第四種 不通過引數傳值
//這種方式與第二種相呼應,可以自定義名字,如getMenuAttribute
//此時獲得值的方式,就有兩種了,
//1、$this->attributes['is_menu']
//2、$this->is_menu
//而在模板呼叫時,則使用$item->menu
public function getMenuAttribute()
{
//return $this->is_menu."bb";
//或者
return $this->attributes['is_menu'].'bb';
}
//總結:函式名命名方式不同,則模板呼叫時的屬性名也不一樣,
//當使用引數傳值時,要注意 $this->is_menu 的使用前提,
//至於為什麼當函式名為getIsMenuAttribute時,不能使用$this->is_menu這種
//方式來獲得值,是框架為了安全著想,所以不能同時使用
//至於,到底選用哪種寫法,根據需求和自己的喜好,本人推薦採用自定義屬性名的方式,這種寫法既可以
//保留原有欄位的值,還能得到修改後的值的格式