1. 程式人生 > 實用技巧 >laravel 訪問器的使用場景、方法和格式詳解

laravel 訪問器的使用場景、方法和格式詳解

在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這種 //方式來獲得值,是框架為了安全著想,所以不能同時使用 //至於,到底選用哪種寫法,根據需求和自己的喜好,本人推薦採用自定義屬性名的方式,這種寫法既可以 //保留原有欄位的值,還能得到修改後的值的格式