Laravel 5.3 語意化規則撰寫

Author Avatar
Yish 11月 28, 2016
  • 在其他設備中閱讀本文章

在先前 Laravel 驗證規則寫入時,如果你操作的驗證方法跟 DB 有點關係,那麼你可能會有這樣子的寫法:

1
'email' => 'unique:users,email_address,'.$user->id.',user_id'

看起來是挺簡單的,但問題出在如果官方文檔沒有寫範例你很難去知道她如何使用,甚至你想帶上自己的參數或者特別的需求也很難去變更,要變更只能去追底層代碼和自己實作一層 class 來處理這樣子的問題,例如這樣:

1
Validator::unique('users')->ignoreWhenUpdate($user->id)

這看起來是解決了這樣子的問題,但是難道 Laravel 沒有內建的做法嗎?終於在大家的需求中誕生了 Rule 這個類別,這個類別其實就是為了解決這樣子的問題。

1
Rule::unique('users')->ignore($user->id),

也可以自訂 table 欄位 id (預設是 id)

1
Rule::unique('users')->ignore($user->id, 'user_id')

或者也可以再加入 closure 判斷:

1
2
3
Rule::unique('users')->where(function ($query) {
$query->where('account_id', 1);
})

這讓規則更加清晰易懂,並且在 Rule 這個類別當中提供了幾個方法可以操作:

API 文檔

  • Dimensions
    裡面包含了像是長寬高跟最小長寬高比等等

  • Exists
    包含了 where, whereNull, whereNot 等,甚至提供了 using 自己寫 closure 的作法

  • In
    確認輸入的字串是不是在驗證規則內

  • NotIn
    確認字串不在驗證規則內

  • Unique
    跟 exists 一樣包含了許多關於資料庫 where 的操作方法,當然也提供了自己寫 closure 的作法

如果對於操作或說明上想了解更多可以參考官方文檔

如果想看簡單的範例可以參考 Laracasts