- 基本用法
- 處理錯誤消息
- 錯誤消息和視圖
- 可用的驗證規則
- 有條件地添加規則
- 自定義錯誤消息
- 自定義驗證規則
基本用法
Laravel提供了一個簡單、方便的工具,用於驗證數據並通過validation
類檢索驗證錯誤消息。
基本驗證示例
$validator = Validator::make(
array('name' => 'Dayle'),
array('name' => 'required|min:5')
);
傳遞給make
方法的第一個參數是正在驗證的數據。第二個參數是應該應用於數據的驗證規則。
使用數組指定規則
可以使用“管道”字符或作為數組的單獨元素來分隔多個規則。
$validator = Validator::make(
array('name' => 'Dayle'),
array('name' => array('required', 'min:5'))
);
驗證多個字段
$validator = Validator::make(
array(
'name' => 'Dayle',
'password' => 'lamepassword',
'email' => 'email@example.com'
),
array(
'name' => 'required',
'password' => 'required|min:8',
'email' => 'required|email|unique:users'
)
);
創建驗證程序實例后,可以使用fails(或passes)方法執行驗證。
if ($validator->fails())
{
// 給定的數據未通過驗證
}
如果驗證失敗,您可以從驗證器檢索錯誤消息。
$messages = $validator->messages();
您還可以訪問一組失敗的驗證規則,而無需消息。為此,請使用失敗的方法:
$failed = $validator->failed();
正在驗證文件
Validator
類提供了一些用於驗證文件的規則,例如大小、mime和其他規則。在驗證文件時,您可以簡單地將它們與其他數據一起傳遞到驗證器中。
處理錯誤消息
在對驗證器實例調用了messages
方法之后,您將收到一個MessageBag
實例,該實例有各種方便的方法來處理錯誤消息。
檢索字段的第一條錯誤消息
echo $messages->first('email');
檢索字段的所有錯誤消息
foreach ($messages->get('email') as $message)
{
//
}
檢索所有字段的所有錯誤消息
foreach ($messages->all() as $message)
{
//
}
確定字段是否存在消息
if ($messages->has('email'))
{
//
}
檢索格式為的錯誤消息
echo $messages->first('email', '<p>:message</p>');
注意:默認情況下,消息使用與引導程序兼容的語法格式化。
檢索格式為的所有錯誤消息
foreach ($messages->all('<li>:message</li>') as $message)
{
//
}
錯誤消息和視圖
一旦執行了驗證,就需要一種簡單的方法將錯誤消息返回到視圖中。這是laravel很方便處理的。以下列路線為例:
Route::get('register', function()
{
return View::make('user.register');
});
Route::post('register', function()
{
$rules = array(...);
$validator = Validator::make(Input::all(), $rules);
if ($validator->fails())
{
return Redirect::to('register')->withErrors($validator);
}
});
注意,當驗證失敗時,我們使用withErrors
方法將驗證程序實例傳遞給重定向。此方法將錯誤消息刷新到會話,以便在下次請求時可用。
但是,請注意,我們不必顯式地將錯誤消息綁定到GET路由中的視圖。這是因為Laravel將始終檢查會話數據中的錯誤,並自動將它們綁定到視圖(如果它們可用)。**因此,需要注意的是,在您的所有視圖中,每次請求時都會有一個\(errors變量,** 允許您方便地假設`\)errors變量始終是定義的並且可以安全地使用。
$errors變量將是
MessageBag`的一個實例。
因此,重定向后,可以在視圖中使用自動綁定的$errors變量:
<?php echo $errors->first('email'); ?>
命名錯誤包
如果在一個頁面上有多個表單,您可能希望命名錯誤消息包。這將允許您檢索特定表單的錯誤消息。只需將名稱作為第二個參數傳遞給withErrors
:
return Redirect::to('register')->withErrors($validator, 'login');
然后,您可以從$errors
變量訪問命名的MessageBag
實例:
<?php echo $errors->login->first('email'); ?>
可用的驗證規則
以下是所有可用驗證規則及其功能的列表:
- Accepted
- Active URL
- After (Date)
- Alpha
- Alpha Dash
- Alpha Numeric
- Array
- Before (Date)
- Between
- Boolean
- Confirmed
- Date
- Date Format
- Different
- Digits
- Digits Between
- Exists (Database)
- Image (File)
- In
- Integer
- IP Address
- Max
- MIME Types
- Min
- Not In
- Numeric
- Regular Expression
- Required
- Required If
- Required With
- Required With All
- Required Without
- Required Without All
- Same
- Size
- String
- Timezone
- Unique (Database)
- URL
accepted
正在驗證的字段必須是yes、on或1。這對於驗證“服務條款”接受是有用的。
active_url
根據checkdnsrr
PHP函數,正在驗證的字段必須是有效的URL。
after:date
正在驗證的字段必須是給定日期之后的值。日期將傳遞到PHP strtotime
函數中。
alpha
正在驗證的字段必須完全是字母字符。
alpha_dash
正在驗證的字段可能包含字母數字字符以及破折號和下划線。
alpha_num
正在驗證的字段必須完全是字母數字字符。
array
正在驗證的字段必須是數組類型。
before:date
正在驗證的字段必須是給定日期之前的值。日期將傳遞到PHP strtotime函數中。
between:min,max
正在驗證的字段的大小必須介於給定的最小值和最大值之間。字符串、數字和文件的計算方式與大小規則相同。
boolean
驗證中的字段必須能夠轉換為布爾值。接受的輸入為true、false、1、0、“1”和“0”。
confirmed
正在驗證的字段必須有一個匹配的foo_confirmation
字段。例如,如果正在驗證的字段是password
,則輸入中必須存在匹配的password_confirmation
字段。
date
根據strtotime PHP函數,正在驗證的字段必須是有效日期。
date_format:format
正在驗證的字段必須與根據date_parse_from_format
PHP函數定義的格式匹配。
different:field
給定字段必須與正在驗證的字段不同。
digits:value
正在驗證的字段必須是數字,並且必須具有精確的值長度。
digits_between:min,max
正在驗證的字段的長度必須介於給定的最小值和最大值之間。
正在驗證的字段必須格式化為電子郵件地址。
exists:table,column
正在驗證的字段必須存在於給定的數據庫表中。
Basic Usage Of Exists Rule
'state' => 'exists:states'
Specifying A Custom Column Name
'state' => 'exists:states,abbreviation'
您還可以指定更多將添加為查詢的“where”子句的條件:
'email' => 'exists:staff,email,account_id,1'
將NULL
作為“where”子句值傳遞將添加對空數據庫值的檢查:
'email' => 'exists:staff,email,deleted_at,NULL'
image
正在驗證的文件必須是圖像(jpeg、png、bmp或gif)
in:foo,bar,...
驗證中的字段必須包含在給定的值列表中。
integer
正在驗證的字段必須具有整數值。
ip
正在驗證的字段必須格式化為IP地址。
max:value
驗證中的字段必須小於或等於最大值。字符串、數字和文件的計算方式與大小規則相同。
mimes:foo,bar,...
正在驗證的文件必須具有與列出的擴展名之一對應的MIME類型。
Basic Usage Of MIME Rule
'photo' => 'mimes:jpeg,bmp,png'
min:value
正在驗證的字段必須具有最小值。字符串、數字和文件的計算方式與大小規則相同。
not_in:foo,bar,...
正在驗證的字段不能包含在給定的值列表中。
numeric
正在驗證的字段必須有一個數值。
regex:pattern
正在驗證的字段必須與給定的正則表達式匹配。
注意:使用regex模式時,可能需要在數組中指定規則,而不是使用管道分隔符,特別是當正則表達式包含管道字符時。
required
輸入數據中必須存在正在驗證的字段。
required_if:field,value,...
如果字段字段等於任何值,則必須存在正在驗證的字段。
required_with:foo,bar,...
只有當任何其他指定字段存在時,驗證中的字段才必須存在。
required_with_all:foo,bar,...
只有當所有其他指定字段都存在時,驗證中的字段才必須存在。
required_without:foo,bar,...
只有當其他指定字段不存在時,驗證中的字段才必須存在。
required_without_all:foo,bar,...
只有當所有其他指定字段都不存在時,驗證中的字段才必須存在。
same:field
給定字段必須與正在驗證的字段匹配。
size:value
正在驗證的字段必須具有與給定值匹配的大小。對於字符串數據,值對應於字符數。對於數字數據,值對應於給定的整數值。對於文件,大小對應於以千字節為單位的文件大小。
string:value
正在驗證的字段必須是字符串類型。
timezone
根據時區標識符列表PHP函數,正在驗證的字段必須是有效的時區標識符。
unique:table,column,except,idColumn
在給定的數據庫表中,要驗證的字段必須是唯一的。如果未指定column
選項,則將使用字段名。
Basic Usage Of Unique Rule
'email' => 'unique:users'
Specifying A Custom Column Name
'email' => 'unique:users,email_address'
Forcing A Unique Rule To Ignore A Given ID
'email' => 'unique:users,email_address,10'
Adding Additional Where Clauses
您還可以指定更多將添加為查詢的“where”子句的條件:
'email' => 'unique:users,email_address,NULL,id,account_id,1'
在上述規則中,只有帳戶id為1的行才會包含在唯一檢查中。
url
正在驗證的字段必須格式化為URL。
注意:此函數使用PHP的filter was方法。
有條件地添加規則
在某些情況下,您可能希望僅當輸入數組中存在某個字段時才對該字段運行驗證檢查。要快速完成此操作,請將“有時”規則添加到規則列表中:
$v = Validator::make($data, array(
'email' => 'sometimes|required|email',
));
在上面的示例中,只有當電子郵件字段出現在$data數組中時,才會對其進行驗證。
復雜條件驗證
有時,僅當另一個字段的值大於100時,才需要給定的字段。或者,只有當存在另一個字段時,才需要兩個字段具有給定值。添加這些驗證規則不一定很麻煩。首先,使用靜態規則創建一個驗證程序實例,這些規則永遠不會更改:
$v = Validator::make($data, array(
'email' => 'required|email',
'games' => 'required|numeric',
));
假設我們的web應用程序是為游戲收藏者設計的。如果一個游戲收集器在我們的應用程序中注冊,並且他們擁有100多個游戲,我們希望他們解釋為什么他們擁有這么多游戲。例如,也許他們經營一家游戲轉賣店,或者他們只是喜歡收藏。為了有條件地添加這個需求,我們可以在驗證器實例上使用有時方法。
$v->sometimes('reason', 'required|max:500', function($input)
{
return $input->games >= 100;
});
傳遞給有時方法的第一個參數是我們要條件驗證的字段的名稱。第二個參數是我們要添加的規則。如果作為第三個參數傳遞的閉包返回true,則將添加規則。這種方法使得建立復雜的條件驗證變得輕而易舉。您甚至可以同時為多個字段添加條件驗證:
$v->sometimes(array('reason', 'cost'), 'required', function($input)
{
return $input->games >= 100;
});
注意:傳遞給閉包的$input參數將是Illuminate\Support\Fluent的實例,可以用作訪問輸入和文件的對象。
自定義錯誤消息
如果需要,可以使用自定義錯誤消息進行驗證,而不是使用默認值。有幾種方法可以指定自定義消息。
將自定義消息傳遞到驗證器
$messages = array(
'required' => 'The :attribute field is required.',
);
$validator = Validator::make($input, $rules, $messages);
注意:屬性占位符將替換為被驗證字段的實際名稱。您還可以在驗證消息中使用其他占位符。
其他驗證場所持有人
$messages = array(
'same' => 'The :attribute and :other must match.',
'size' => 'The :attribute must be exactly :size.',
'between' => 'The :attribute must be between :min - :max.',
'in' => 'The :attribute must be one of the following types: :values',
);
為給定屬性指定自定義消息
有時您可能希望僅為特定字段指定自定義錯誤消息:
$messages = array(
'email.required' => 'We need to know your e-mail address!',
);
在語言文件中指定自定義消息
在某些情況下,您可能希望在語言文件中指定自定義消息,而不是將它們直接傳遞給驗證器。為此,請將消息添加到app/lang/xx/validation.php
語言文件中的自定義數組中。
'custom' => array(
'email' => array(
'required' => 'We need to know your e-mail address!',
),
),
自定義驗證規則
注冊自定義驗證規則
Laravel提供了各種有用的驗證規則;但是,您可能希望指定一些自己的驗證規則。注冊自定義驗證規則的一種方法是使用Validator::extend
方法:
Validator::extend('foo', function($attribute, $value, $parameters)
{
return $value == 'foo';
});
自定義驗證器閉包接收三個參數:正在驗證的$attribute
的名稱、屬性的$value
和$param
數組
您還可以將類和方法傳遞給擴展方法而不是閉包:
Validator::extend('foo', 'FooValidator@validate');
請注意,您還需要為自定義規則定義錯誤消息。可以使用內聯自定義消息數組或通過在驗證語言文件中添加條目來執行此操作。
擴展驗證器類
與使用閉包回調來擴展驗證器不同,您還可以擴展驗證器類本身。為此,請編寫一個擴展Illuminate\Validation\Validator
的驗證程序類。可以通過將驗證方法添加到類中,然后用驗證:
<?php
class CustomValidator extends Illuminate\Validation\Validator {
public function validateFoo($attribute, $value, $parameters)
{
return $value == 'foo';
}
}
注冊自定義驗證器解析程序
接下來,您需要注冊您的自定義驗證器擴展:
Validator::resolver(function($translator, $data, $rules, $messages)
{
return new CustomValidator($translator, $data, $rules, $messages);
});
創建自定義驗證規則時,有時可能需要為錯誤消息定義自定義占位符替換。您可以通過創建自定義驗證器(如上所述)並向驗證器添加replaceXXX
函數來完成此操作。
protected function replaceFoo($message, $attribute, $rule, $parameters)
{
return str_replace(':foo', $parameters[0], $message);
}
如果要添加自定義消息“replacer”而不擴展Validator
類,可以使用Validator::replacer
方法:
Validator::replacer('rule', function($message, $attribute, $rule, $parameters)
{
//
});