回到最上方

文件

驗證

基本使用

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 類別提供幾個針對檔案的驗證規則,像是 sizemimes 以及其它規則等。 當驗證檔案時,你可以把這些規則同時和你的其它資料一併送至驗證器中。

使用錯誤訊息

透過 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

欄位資料必需為 yeson1 。 這個驗證規則通常被使用在「同意服務條款」之類。

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

欄位資料必需在界於 minmax 之間。 適用於字串、數字和檔案的 size 驗證規則。

confirmed

欄位資料必需和欄位名稱加 _confirmation 的欄位資料一致。 例如一個名稱為 password 的名稱,那麼他就必需和欄位名稱為 password_confirmation 一樣才行。

date

欄位資料必需一個有效的日期格式。 資料將會透過 PHP 函式 strtotime 轉換後比對檢查。

date_format:format

欄位資料必需一個符合指定的日期格式。 資料將會透過 PHP 函式date_parse_from_format 比對檢查。

different:field

欄位資料必需不同於指定的 field 欄位資料。

email

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);
}

討論