驗證
基本使用
Laravel 透過 Validation
類別來實現一個簡單便利的資料驗證作業以及錯誤訊息的取得。
基本驗證範例
$validator = Validator::make(
array('name' => 'Dayle'),
array('name' => 'required|min:5')
);
傳送到 make
方法的第一個參數是尚未驗證的資料。 第二個參數是資料的驗證規則。
若有多個驗證規則時,可以使用 "|" 來進行分隔,或是將多個規則組成一個陣列。
Using Arrays To Specify Rules
$validator = Validator::make(
array('name' => 'Dayle'),
array('name' => array('required', 'min:5'))
);
一旦 Validator
驗證器被建立後,就可以開始使用 fails
(或 passes
) 方法進行驗證作業。
if ($validator->fails())
{
// 未通過驗證的資料
}
當資料驗證失敗,你可以從驗證器取得相關的錯誤訊息。
$messages = $validator->messages();
你也許想取得那些已驗證失敗的規則陣列。 可以使用 failed
這個方法:
$failed = $validator->failed();
驗證檔案
Validator
類別提供幾個針對檔案的驗證規則,像是 size
、 mimes
以及其它規則等。 當驗證檔案時,你可以把這些規則同時和你的其它資料一併送至驗證器中。
使用錯誤訊息
透過 Validator
驗證器呼叫 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>');
注意: 錯誤訊息預設採用相容 Bootstrap 樣式的語法。
將所有錯誤訊息套用輸出格式
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
方法傳送 Validator
驗證器。 這個方法會將錯誤訊息快取存入到 session 中,以便我們下一次能夠繼續使用。
注意我們的路由並沒有明確綁定錯誤訊息到視圖中。 這是因為 Laravel 總是會自動檢查 session 資料的正確性,並嘗試把它們綁定到視圖中。 因此非常重要的一點:在你的所有視圖中,總是會有一個名為 $errors
變數。這樣可以確保假設 $errors
已經被定義且可以安全使用。 $errors
變數當於一個 MessageBag
訊息包裹。
所以在頁面重新導向後,你可以在你的視圖中使用 $errors
變數:
<?php echo $errors->first('email'); ?>
可驗證的規則
下列清單為現行可用的所有驗證規則以及它們的函式:
- Accepted
- Active URL
- After (Date)
- Alpha
- Alpha Dash
- Alpha Numeric
- Before (Date)
- Between
- Confirmed
- Date
- Date Format
- Different
- Exists (Database)
- Image (File)
- In
- Integer
- IP Address
- Max
- MIME Types
- Min
- Not In
- Numeric
- Regular Expression
- Required
- Required If
- Required With
- Same
- Size
- Unique (Database)
- URL
accepted
欄位資料必需為 yes 、 on 、 1 。 這個驗證規則通常被使用在「同意服務條款」之類。
active_url
欄位資料必需符合 PHP checkdnsrr
函式檢查過的有效 URL。
after:date
欄位資料必需在指定的日期時間之後。資料將會透過 PHP strtotime
轉換後比對檢查。
alpha
欄位資料必需是英文字母(a-zA-Z)所組合。
alpha_dash
欄位資料必需是英文字母(a-zA-Z)或數字(0-9)或破折號(-)或底線(_)所組合。
alpha_num
欄位資料必需是英文字母(a-zA-Z)或數字(0-9)所組合。
before:date
欄位資料必需在指定的日期時間之前。 資料將會透過 PHP 函式 strtotime
轉換後比對檢查。
between:min,max
欄位資料必需在界於 min 與 max 之間。 適用於字串、數字和檔案的 size
驗證規則。
confirmed
欄位資料必需和欄位名稱加 _confirmation
的欄位資料一致。 例如一個名稱為 password
的名稱,那麼他就必需和欄位名稱為 password_confirmation
一樣才行。
date
欄位資料必需一個有效的日期格式。 資料將會透過 PHP 函式 strtotime
轉換後比對檢查。
date_format:format
欄位資料必需一個符合指定的日期格式。 資料將會透過 PHP 函式date_parse_from_format
比對檢查。
different:field
欄位資料必需不同於指定的 field 欄位資料。
The field under validation must be formatted as an e-mail address.
exists:table,column
欄位資料必需存在指定的資料庫表中。
存在規則基本用法
'state' => 'exists:states'
特別指定欄位名稱
'state' => 'exists:states,abbreviation'
你也許想要再加一些像 "where" 的限制條件:
'email' => 'exists:staff,email,account_id,1'
image
欄位資料必需是個影像檔(jpeg, png, bmp, 或 gif)。
in:foo,bar,...
欄位資料必需符合所列的清單值之一。
integer
欄位資料必需是個整數。
ip
欄位資料必需符合 IP 格式。
max:value
欄位資料最大值不能高於 value 。 適用於字串、數字和檔案的 size
驗證規則。
mimes:foo,bar,...
欄案欄位資料必需符合屬於指定所列的 MIME 類型清單中的一項。
MIME 驗證規則的基本用法
'photo' => 'mimes:jpeg,bmp,png'
min:value
欄位資料最小值不能低於 value 。適用於字串、數字和檔案的 size
驗證規則。
not_in:foo,bar,...
欄位資料不能是清單裡面的值。
numeric
欄位資料必需為數字。
regex:pattern
欄位資料必需符合正規表示式的內容。
注意:
當使用 regex
正規表示式,那就必要使用陣列方法來取代使用"|"符號方法去提供驗證規則,特別當你的正規表示式裡面含有"|"符號時。
required
欄位資料必需輸入資料
required_if:field,value
如果某個指定的 field 欄位資料等於指定的 value 資料。那欄位資料就必需輸入。
required_with:foo,bar,...
只有在某個指定的 field (only if)欄位出現時,那欄位資料就必需輸入。
same:field
欄位資料必需和指定的任外一個 field 欄位資料相符合。
size:value
欄位資料必需符合 size 所指定的 value 值。 value 比對的是字串的長度(字元數)。 value 比對的是整數值。 對檔案資料而言, size 是檔案大小,也就是位元組(kB)。
unique:table,column,except,idColumn
欄位資料在資料庫表中,必需是唯一的。如果沒有特定指定欄位 column
的選項,預設的欄位名稱將被使用。
唯一規則的基本用法
'email' => 'unique:users'
特別指定一個欄位
'email' => 'unique:users,email_address'
檢查唯一規則但忽略指定的ID
'email' => 'unique:users,email_address,10'
url
被驗證的欄位資料格式必須符合網址 (URL) 格式
自訂錯誤訊息
如果需要,你也可以自訂驗證錯誤訊息來取代原先預設的錯誤訊息。 這裡有幾個方法來指定自訂的訊息。
傳送自訂訊息到驗證器中
$messages = array(
'required' => 'The :attribute field is required.',
);
$validator = Validator::make($input, $rules, $messages);
注意: :attribute
這個補位標誌將會被取代成未驗證欄位實際的名稱。 你也能自行追加其它補位標誌到你的驗證訊息中。
其它補位標誌
$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!',
);
在某一些案例中,你可能想要在語系檔中自訂訊息,來代替直接傳送給 Validator
驗證器的作法。 可以將你的自訂訊息追加到 app/lang/xx/validation.php
語系檔 custom
的陣列中。
以語系檔方式自訂訊息
'custom' => array(
'email' => array(
'required' => 'We need to know your e-mail address!',
),
),
自訂驗證規則
Laravel provides a variety of helpful validation rules; however, you may wish to specify some of your own. One method of registering custom validation rules is using the Validator::extend
method:
註冊自訂驗證規則
Validator::extend('foo', function($attribute, $value, $parameters)
{
return $value == 'foo';
});
注意: 傳入
extend
方法的規則名稱必需是"駝峰式"。
自訂驗證閉包函式有三個參數:欲被驗證欄位名稱 $attribute
、欄位資料 $value
,以及參數陣列 $parameters
。
你也能透過 extend
"類別@方法" 名稱方式來指定驗證函式:
Validator::extend('foo', 'FooValidator@validate');
你應該也要為你自訂的規則定義一些錯誤訊息。 你也使用行內訊息陣列
除了使用閉包呼叫函式,另外一種作法是繼承驗證器。 若要這樣做,試著寫一個驗證類別並繼承 Illuminate\Validation\Validator
。 你就能透過前綴詞 validate
來追加一個驗證方法:
繼承驗證類別
<?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);
});
當建立自訂的驗證規則,你有時候需要定義錯誤訊息的補位標誌。 你可以建立自訂的驗證描述字串如下,追加一個前置詞為 replace 的函式像是 replaceXXX
到你的驗證器中。
protected function replaceFoo($message, $attribute, $rule, $parameters)
{
return str_replace(':foo', $parameters[0], $message);
}