10. Laravel 4 驗證

如何進行驗證

典型的註冊表單:php

<!-- app/views/form.blade.php -->
{{ Form::open(array('url' => 'registration')) }}
    {{-- Username field. ------------------------}}
    {{ Form::label('username', 'Username') }}
    {{ Form::text('username') }}
    {{-- Email address field. -------------------}}
    {{ Form::label('email', 'Email address') }}
    {{ Form::email('email') }}
    {{-- Password field. ------------------------}}
    {{ Form::label('password', 'Password') }}
    {{ Form::password('password') }}
    {{-- Password confirmation field. -----------}}
    {{ Form::label('password_confirmation', 'Password confirmation') }}
    {{ Form::password('password_confirmation') }}
    {{-- Form submit button. --------------------}}
    {{ Form::submit('Register') }}
{{ Form::close() }}

路由部分:laravel

// app/routes.php
Route::get('/', function()
{
    return View::make('form');
});
Route::post('/registration', function()
{
    // 獲取全部表單數據.
    $data = Input::all();
    // 建立驗證規則
    $rules = array(
        'username' => array('alpha_num', 'min:3')
    );
    // 開始驗證
    $validator = Validator::make($data, $rules);
    if ($validator->passes())
    { // 驗證成功
        return 'Data was saved.';
    } // 驗證失敗
    return Redirect::to('/');
});

可用的驗證規則

regex:pattern(正則)

驗證此規則的值必須符合給定的正則表達式。正則表達式

accepted(yes|no|1)

驗證此規則的值必須是 yes、 on 或者是 1。這在驗證是否贊成"服務條款"的時候很是有用。數據庫

in:foo,bar,...(in 規則)

驗證此規則的值必須在給定的列表中存在。json

notin:_foo,bar,...(not in 規則)

驗證此規則的值必須在給定的列表中不存在。數組

alpha(所有字母)

驗證此規則的值必須所有由字母字符構成。app

numeric(數字)

驗證此規則的值必須是一個數字。函數

alpha_num(字母|數字)

驗證此規則的值必須所有由字母和數字構成。post

alpha_dash(字母|數字|中劃線|下劃線)

驗證此規則的值必須所有由字母、數字、中劃線或下劃線字符構成。ui

url(合法 URL,不嚴謹)

驗證此規則的值必須是一個合法的 URL。
注意: 已經證明此規則不嚴謹,相似 2http://url.com 的 URL 能夠經過驗證。

active_url(合法 URL,基於 checkdnsrr)

驗證此規則的值必須是一個合法的 URL,根據 PHP 函數 checkdnsrr。
注意: 因爲是基於 checkdnsrr 所以也可用於驗證郵箱地址是否存在。

email(電子郵件)

驗證此規則的值必須是一個合法的電子郵件地址。

image (jpeg|png|bmp|gif)

驗證此規則的值必須是一個圖片 (jpeg, png, bmp 或者 gif)。

integer(整數)

驗證此規則的值必須是一個整數。

ip(IP 地址)

驗證此規則的值必須是一個合法的 IP 地址。

before:date(給定日期以前)

驗證此規則的值必須在給定日期以前,日期將經過 PHP 函數 strtotime 傳遞。

after:date(給定日期以後)

驗證此規則的值必須在給定日期以後,日期將經過 PHP 函數 strtotime 傳遞。

between:min,max(min 和 max 之間)

驗證此規則的值必須在給定的 min 和 max 之間。字符串、數字以及文件都將使用大小規則進行比較。

confirmed(二次確認域,如「密碼的二次確認域」)

驗證此規則的值必須和 foo_confirmation 的值相同。好比,須要驗證此規則的域是 password,那麼在輸入中必須有一個與之相同的 password_confirmation 域。

same:field(值與給定域相同)

驗證此規則的值必須與給定域的值相同。

size:value(大小與給定域的值相同)

驗證此規則的值的大小必須與給定的 value 相同。
對於字符串,value 表明字符的個數,
對於數字,value 表明它的整數值,
對於文件,value 表明文件以KB爲單位的大小。

date(合法日期字符串,基於 strtotime)

驗證此規則的值必須是一個合法的日期,根據 PHP 函數 strtotime。

dateformat:_format(format 格式 y-m-d H:i:s)

驗證此規則的值必須符合給定的 format 的格式,根據 PHP 函數 date_parse_from_format。

different:field(不一樣於)

驗證此規則的值必須與指定的 field 域的值不一樣。

min:value(最小值)

驗證此規則的值必須大於最小值 value。字符串、數字以及文件都將使用大小規則進行比較。

max:value(最大值)

驗證此規則的值必須小於最大值 value。字符串、數字以及文件都將使用大小規則進行比較。

mimes:foo,bar,...(MIME 類型限制)

驗證此規則的文件的 MIME 類型必須在給定的列表中。

MIME 規則的基礎使用
'photo' => 'mimes:jpeg,bmp,png'

注意: 當使用 regex 模式的時候,有必要使用數組指定規則,而不是管道分隔符,特別是正則表達式中包含一個管道字符的時候。

required(必填)

驗證此規則的值必須在輸入數據中存在。

requiredif:_field,value(當指定域爲某個值時,必填)

當指定的域爲某個值的時候,驗證此規則的值必須存在。

requiredwith:_foo,bar,...(當指定域存在時,必填)

僅當指定的域存在的時候,驗證此規則的值必須存在。

requiredwithout:_foo,bar,...(當指定域不存在時,必填)

僅當指定的域不存在的時候,驗證此規則的值必須存在。

exists:table,column(必須存在於 table 表的 column 字段數據中)

驗證此規則的值必須在指定的數據庫的表中存在。

Exists 規則的基礎使用
'state' => 'exists:states'

指定列名

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

您也能夠指定更多的條件,將以 "where" 的形式添加到查詢。

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

unique:table,column,except,idColumn(數據庫惟一)

驗證此規則的值必須在給定的數據庫的表中惟一。若是 column 沒有被指定,將使用該域的名字。

Unique 規則的基礎使用
'email' => 'unique:users'

指定列名

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

強制忽略一個給定的 ID

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

添加額外的where語句
你還能夠指定更多條件,這些條件將被添加到查詢的"where"語句中:

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

在上面的規則中,只有account_id 爲 1 的行纔會被包含到unique檢查中。

如何獲取錯誤消息

構造爲 JSON 數據(API)

Route::post('/registration', function()
{
    // 獲取所有提交數據
    $data = Input::all();
    // 構造規則數組
    $rules = array(
        'username' => 'alpha_num'
    );
    // 開始驗證
    $validator = Validator::make($data, $rules);
    if ($validator->passes())
    { // 驗證經過
        return 'Data was saved.';
    } // 驗證失敗
    // 獲取錯誤消息
    $errors = $validator->messages();
    // 構造 JSON 響應
    return Response::json($errors);
});

重定向,直接傳遞至下一個頁面

return Redirect::to('/')->withErrors($validator);
視圖中如何獲取傳遞過來的錯誤消息

注意: $errors 是系統預約義變量,任何模板中都可使用。

獲取一個域的第一個錯誤消息
{{ $errors->first('username') }}
獲取一個域的所有錯誤消息
@foreach($errors->get('username') as $message)
    <li>{{ $message }}</li>
@endforeach
獲取所有域的所有錯誤消息
@foreach($errors->all() as $message)
    <li>{{ $message }}</li>
@endforeach
檢查一個域是否存在消息
@if($errors->has('email'))
    <p>Yey, an error!</p>
@endif
以某種格式獲取一條錯誤消息
{{ $errors->first('username', '<span class="error">:message</span>') }}

注意: 默認狀況下,消息將使用與 Bootstrap 兼容的語法進行格式化。

以某種格式獲取全部錯誤消息
@foreach($errors->all('<li>:message</li>') as $message)
    {{ $message }}
@endforeach

定製驗證規則

注意: 匿名函數 和 指向普通類方法 的 規則擴展 並不推薦,所以直接介紹如何直接擴展官方的驗證器。

編寫擴展驗證器類:

class ExValidator extends Illuminate\Validation\Validator {
    // 規則
    public function validateFoo($attribute, $value, $parameters)
    {
        return $value == 'foo';
    }
    // 消息
    protected function replaceFoo($message, $attribute, $rule, $parameters)
    {
        return str_replace(':foo', $parameters[0], $message);
    }
}

註冊定製的驗證器擴展:

Validator::resolver(function($translator, $data, $rules, $messages)
{
    return new ExValidator($translator, $data, $rules, $messages);
});

詳細的編寫方法請參照官方類 /vendor/laravel/framework/src/Illuminate/Validation/Validator.php

定製驗證消息

針對某一個驗證規則:

$messages = array(
    'required' => 'The :attribute field is required.',
);
$validator = Validator::make($input, $rules, $messages);

針對指定域的某一規則:

$messages = array(
    'email.required' => 'We need to know your e-mail address!',
);

在語言文件中定義 /app/lang/zh-CN/validation.php

'custom' => array(
    'email' => array(
        'required' => '請填寫您的 email 地址。',
    ),
),
相關文章
相關標籤/搜索