laravel 基礎教程 —— 驗證

//驗證規則
$rules=[
    'password'=>'required||between:3,20||confirmed',
];
//驗證規則提示信息
$msg=[
    'password.required'=>'新密碼不能爲空',
    'password.between'=>'新密碼必須6~20位之間',
    'password.confirmed'=>'密碼和確認密碼不匹配',
];

下面是所有的可用的驗證約束和它們的功能的列表:

accepted

驗證的字段必須爲 yeson,1,或者 true。這通常用來驗證服務條款的承諾。

active_url

驗證的字段必須可以通過 checkdnsrr PHP 方法的驗證。

after:date

驗證的字段必須是給定日期之後的值。日期會被傳遞到 strtotime PHP 方法:

`start_date' => 'required|date|after:tomorrow'

你也可以指定使用其它字段的日期來進行評估:

'finish_date' => 'required|date|after:start_date'

alpha

驗證的字段必須全部是由字母字符組成的字符串。

alpha_dash

驗證的字段可以是字母,數字,-,_ 所組成的字符串。

alpha_num

驗證的字段必須全部由字母或數字所組成。

array

驗證的字段必須是一個 PHP array

before:date

驗證的字段的值必須比指定的日期要早。指定的日期會被傳遞到 PHP 的 strtotime 方法。

between:min,max

驗證的字段的大小必須在給定的 min 和 max 之間。字符串,數字和文件都會使用和 size 約束的相同的評估方式。

boolean

驗證的字段必須能夠轉換爲布爾值。所接受的輸入可以是 truefalse10"1""0"

confirmed

驗證的字段必須能夠和 foo_confirmation 字段相匹配。比如,如果驗證的字段是 password,相應的password_confirmation 字段必須在輸入中被提供且與 password 相匹配。

date

驗證的字段必須是一個有效的日期,它應該能被 strtotime PHP 方法通過。

date_format:format

驗證的字段必須匹配給定的格式。該格式會被 PHP date_parse_from_format 方法評定,你應該只使用 date 或者date_format 其中之一來進行驗證字段,不要全部都使用。

different:field

驗證的字段必須與給定的字段不同。

digits:value

驗證的字段必須是數字類型並且具有指定的長度。

digits_between:min,max

驗證的字段必須具有指定區間的長度。

dimensions

驗證的字段必須是一個圖片類型的,並且要求符合指定的參數約束:

'avatar' => 'dimensions:min_with=100,min_height=200'

可用的參數有:min_widthmax_widthmin_heightmax_heightwidthheightratio

distinct

當與數組協作時,驗證的字段中必須不能含有重複的值:

'foo.*.id' => 'distinct'

email

驗證的字段必須是一個郵件地址的格式。

exists:table,column

驗證的字段必須能在指定數據庫表中檢索的到。

Exists 基礎約束用法

'state' => 'exists:states'

指定自定義列名稱

'state' => 'exists:states,abbreviation'

你也可以像使用 where 語句一樣指定添加更多的查詢條件:

'email' => 'exists:staff,email,account_id,1'

查詢條件也可以使用 ! 來表明否定值:

'eamil' => 'exists:staff,email,role,!admin'

你也可以傳遞 NULL 或者 NOT_NULL 到查詢語句中:

'eamil' => 'exists:staff,email,deleted_at,NULL''eamil' => 'exists:staff,email,deleted_at,NOT_NULL'

極個別的情況下,你可能需要在 exists 查詢下指定特定的數據庫連接。你可以使用 . 語法將數據庫連接名前置來進行指定:

'email' => 'exists:connection.staff,email'

filled

驗證的字段如果出現,那麼它一定不能爲空值。

image

被驗證的文件必須是一個圖片類型(jpeg,png,bmp,gif,svg)

in:foo,bar,...

驗證的字段必須是給定值列中的一個。

in_array:anotherfield

驗證的字段必須是指定的字段中值列之一。

integer

驗證的字段必須是一個整數。

ip

驗證的字段必須是一個 IP 地址。

json

驗證的字段必須是合法的 JSON 字符串

max:value

驗證的字段必須小於等於指定值。字符串,數字,和文件類型會與 size 約束使用相同的評估方法。

mimetypes:text/plain,...

驗證的字段必須匹配給定的 MIME 類型:

'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime'

爲了判斷所上傳文件的 MIME 類型,laravel 會讀取文件的內容並且會嘗試猜測文件的 MIME 類型,這可能會與客戶端提供的文件 MIME 類型有所區別。

mimes:foo,bar,...

驗證的文件的 MIME 類型相應的後綴必須是所列的值之一。

基礎用法

'photo' => 'mimes:jpeg,bmp,png'

你只需要指定文件的擴展,這個約束會針對文件的內容進行猜測文件的 MIME 類型,然後進行擴展驗證。

完整的 MIME 類型和其相應的擴展後綴,你可以從 這裏 找到。

min:value

驗證的字段必須比指定的值要小。字符串,數字和文件類型會使用 size 約束相同的評估方法。

not_in:foo,bar,...

驗證的字段不應該包含在給定的值列中。

numeric

驗證的字段必須是一個數值類型。

present

驗證的字段必須要求被提供,但是可以爲空。

regex:pattern

驗證的字段必須與給定的正則表達式相匹配。

注意:當使用 regex 模式時,你必須將約束放進數組裏來取代管道符分隔,特別是在正則表達式中包含管道符時。

required

驗證的字段必須被提供並且不能爲空值。判斷空值的依據:

  • 值是 null

  • 值是空字符串

  • 值是一個空數組或者空的 Countable 對象

  • 值是一個沒有傳遞路徑的上傳的文件

required_if:anotherfield,value,...

驗證的字段必須在以下情況下被提供:指定的字段等於任意列出的值。

required_unless:anotherfield,value,...

驗證的字段必須在以下情況下被提供: 所指定的字段和所提供的值都不相等。

required_with:foo,bar,...

驗證的字段只有在其它所指定字段之一被提供時纔會被要求提供。

required_with_all:foo,bar,...

驗證的字段只有在其它所指定字段全部被提供時纔會被要求提供。

required_without:foo,bar,...

驗證的字段只有在其它所指定字段之一沒有被提供時被要求提供。

required_without_all:foo,bar,...

驗證的字段只有在所指定字段全部沒有被提供時纔會被要求提供。

same:field

所驗證的字段必須與指定的字段相匹配。

size:value

驗證的字段必須具有給定值的大小。對於字符串數據,值應該是字符串的字符長度。對於數值數據,值應該是相應的整數值。對於數組,大小匹配數組的 count 大小。對於文件,應該匹配文件的字節大小。

string

驗證的字段必須是一個字符串。

timezone

驗證的字段必須是經過 PHP timezone_identifiers_list 方法驗證的合法的 timezone 標識。

unique:table,column,except,idColumn

驗證的字段必須在給定的數據表中唯一,如果 column 選型沒有被指定,那麼會直接使用字段的名字。

指定自定義的列名

'email' => 'unique:users,email_address'

自定義數據庫連接

極少數情況下,你可能需要指定自定義的數據庫連接來進行驗證。就如上面所看到的,設置 unique:users 會使用默認的數據庫連接來進行約束驗證。如果想指定其他數據庫連接,你可以使用 . 語法並前置指定數據庫連接:

'email' => 'unique:connection.users,email_address'

強迫 Unique 約束 忽略給定的 ID

有時候,你可能會希望 unique 檢查忽略給定的 ID。比如,考慮一下一個更新個人信息的場景,它應該提供用戶的名稱,郵箱地址,和位置。你可能會想要驗證郵箱的唯一性。但是你只想驗證與用戶的當前郵箱不一致的郵箱的唯一性。也就是說你只想驗證這個郵箱有沒有被其他用戶所使用。你需要傳遞 ID 作爲第三個參數來通知 unique 約束來忽略當前用戶的 ID:

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

如果表名使用的主鍵列名不是 id ,那麼你還需要指定主鍵的列名到第四個參數:

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

添加額外的條件查詢

你也可以指定更多的條件查詢:

'email' => 'unique:users,email_address,null,id,account_id,1'

在上面的約束中,只有 account_id 爲 1 的行會被約束進行檢查。

url

驗證的字段必須符合 PHP filter_var 方法驗證的有效 URL。

添加約束條件

在一些場景中,你會希望只有字段出現在了輸入數組中時纔會對其進行驗證。你可以在約束列中添加 sometimes 約束來快速的完成指定:

$v = Validator::make($data, [  'email' => 'sometimes|required|email',
]);

這上面的例子中,只有 $data 中提供了 email 字段,email 的約束纔會對其進行驗證。

複雜的驗證條件

有時候,你可能會希望基於更復雜的條件邏輯去進行約束的驗證。比如,你希望只有另外一個字段擁有比 100 更大的值時纔會驗證給定的字段是否被提供。又或者你想要在只有另外一個字段被提供時纔會需要其他兩個字段的值。添加這些條件判定並非是痛苦的一件事。首先,你還是需要創建一個 Validator 實例和一些靜態的約束:

$v = Validator::make($data, [  'email' => 'required|email',  'games' => 'required|numeric']);

讓我們假定我們的應用是服務於一些遊戲收藏家的。如果一個遊戲收藏家註冊了我們的應用,並且它們添加了超過 100 個遊戲時。我們需要它們解釋一下爲什麼他會擁有那麼多的遊戲。比如,或許他開了一個遊戲販賣超市,又或者他僅僅就是喜歡收藏。我們可以使用 Validator 實例上的 sometimes 方法來添加這個必要的條件:

$v->sometimes('reason', 'required|max:500', function ($input) {  return $input->games >= 100;
});

傳遞到 sometimes 方法的第一個參數是我們需要考慮驗證的字段的名字。第二個參數是我們想要添加的約束。如果第三個參數傳遞的 Closure 返回的結果是 true,那麼這個約束就會被添加進去。這就可以輕鬆的對複雜的驗證場景進行條件的構建。你甚至可以一次性的添加多個字段的條件驗證:

$v->sometimes(['reson', 'cost'], 'required', function ($input) {  return $input->games >= 100; 
});

注意:傳遞到 Closure 中的 $input 是一個 Illuminate\Support\Flument 實例,並且它可以被用來訪問你的輸入和文件。

自定義驗證約束

Laravel 提供了各種有用的驗證約束。但是,你可能希望添加你自己的特定的約束。你可以使用 Validator 假面的extend 方法來註冊自己的驗證約束。讓我們在服務提供者裏註冊一個自定義的驗證約束:

<?phpnamespace App\Providers;use Validator;use Illuminate\Support\ServiceProvider;class AppServiceProvider extends ServiceProvider{  /**
   * Bootstrap any application services.
   *
   * @return void
   */
   public function boot()
   {
     Validator::extend('foo', function ($attribute, $value, $parameters, $validator) {       return $value == 'foo';
     });
   }   /**
    * Register the service provider.
    *
    * @return void
    */
    public function register()
    {      //
    }
}

自定義的驗證閉包中接收四個參數:需要被驗證的屬性名稱,屬性的值,一個需要被傳遞到約束的 $paramters 數組,和 Validator 實例。

你也可以傳遞一個類名和方法到 extend 方法中來代替閉包:

Validator::extend('foo', 'FooValidator@validate');

隱式的擴展

默認的,當屬性被驗證時,如果在輸入數組中沒有被提供,或者驗證約束爲 required 卻是一個空值。那麼普通的驗證約束,包括自定義的約束擴展,都不會再執行。比如,unique 約束就不會在出現 null 值進行執行:

$rules = ['name' => 'unique'];$input = ['name' => null];

Validator:make($input, $rules)->passes(); // true

如果需要約束即使是屬性值爲空時也繼續執行,那麼約束需要暗示屬性是必須的。你可以使用Validator::extendImplicit() 方法來構建一個 “隱式的” 擴展:

Validator::extendImplicit('foo', function ($attribute, $value, $parameters, $validator) {  return $value == 'foo'; 
});

注意: 隱式的擴展僅僅是暗示屬性是必須的,不論它實際上是缺失的值或者是空的屬性,這都取決於你。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章