Laravel4中使用的驗證

Laravel4 中Validator的使用

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 protected]'
    ),
    array(
        'name'=>'required',
        'password'=>'required|min:8',
        'email'=>'required|email|unique:users'
        )
);
````
一旦一個Validator實例被創建,可以使用fails(或者passes)函數執行這個驗證.





<div class="se-preview-section-delimiter"></div>

```php
if ($validator
if ($validator->fails()) {
    //這裏執行驗證失敗的代碼
}

如果驗證失敗,你可以從驗證器中獲取錯誤消息。

$messages = $validator->messages();

你也可以 使用failed函數得到不帶錯誤消息的沒有通過的驗證規則的數組。

$failed = $validator->failed();

文件驗證

Validator類提供了一些驗證規則用於驗證文件,比如size、mimes等,在驗證文件的時候,你可以和其他數據一起傳遞給驗證器。

使用錯誤消息

在一個Validator實例上調用message函數之後,將會得到一個MessageBag實例,該實例擁有很多方便使用錯誤消息的函數。


獲取一個字段的第一個錯誤消息

echo $message->first('email');

獲取一個字段的全部錯誤消息

foreach($message->get('email') as $message){
    //
}

獲取全部字段的全部錯誤消息

foreach($messages->all() as $message) {

}

檢查一個字段是否存在消息

if($message->has('email) {

}

以某種格式獲取一條錯誤消息

echo $message->first('email','<p>:message</p>');

錯誤消息&視圖

一旦你執行了驗證,你需要一種簡單的方法想視圖反饋錯誤消息。這在Laravel中能夠方便的處理。

Route::get('registre',function()
    {
        return View::make('user.registre');
    }
);

Route::post('register',fucntion(){
    $rules = array();
    $validator = Validator::make(Input::all(),$rules);
    if ($validator->fails()) {
        return Redirect::to('register')->withErrors($validator);
    }
});

注意當驗證失敗,我們使用withErrors函數把validator實例傳遞給Redirect。這個函數將刷新Session中保存的錯誤消息。使得他們在下次請求的時候可用。

然而,請注意我們在GET路由中並沒有明確的綁定錯誤消息到視圖。這是因爲Laravel總會檢查Session中的錯誤,並且如果他們是可用的將自動綁定到視圖。所以,需要特別注意的是,對於每個請求,一個errors便 errors變量總是被定義並可以安全使用的。$errors變量殭屍一個MessageBag類的實例。

所以,在跳轉之後,你可以在視圖中使用自動綁定的$errors變量:

<?php echo $errors->first('email);?>

有條件的添加規則

有時候你可能希望給定的字段僅當另外一個字段的值大於100的時候必須存在。或者你可能需要兩個字段均含有一個給定的值,僅當另一個字段存在的時候,廷加這些驗證規則並沒有那麼麻煩。首先,創建一個使用你永遠不會改變的static rules 的 Validator實例:

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

假設我們的WEB應用程序是服務於遊戲收藏愛好者們,如果一個遊戲收藏愛好者註冊了我們的應用程序,並且他擁有100多款遊戲,我們想讓他們說明爲什麼他們會擁有如此多的遊戲,例如,或許他們要開一個遊戲轉售店,或者也許他們只是喜歡收集。爲了有條件的添加這個需求,我們可以使用Validator實例的sometimes函數

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

sometimes函數的第一個參數是我們有條件的驗證的字段名,第二個參數是我們要添加的規則,如果Closure作爲第三個參數並且返回了true,規則將被添加。這種方法可以很容易構建複雜的條件驗證。你甚至可以一次性,爲多個字段添加條件驗證:

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

這個有條件的驗證規則在於,先將必須驗證的規則寫在前面,然後將其他條件規則,利用sometimes添加上

自定義錯誤消息

如果有需要,你可以使用自定的錯誤消息來代替默認的錯誤消息。這裏有好幾種自定義錯誤消息的方法。


傳遞自定義消息到驗證器

$message = array(
    'required'=>'The:attribut field is required.',
);

$validator = Validator::make($input,$rules,$messages);

注意::attribute佔位符將被實際要驗證的字段名替換。


對一個指定的字段指定自定義的錯誤消息

$message = array(
    'email.required'=>'請輸入您的郵箱',
);

在一些情況下你可能希望一個語言文件指定你的錯誤消息,而不是直接傳遞給Validator。爲了實現這個目的,請在app/lang/xx/validation.php文件中添加你的自定義消息到custom數組

在語言文件中指定錯誤消息

'custom'=>array(
    'email'=>array(
        'required'=>'請輸入您的郵箱地址'
    ),
);

自定義驗證規則

Laravel提供了一系列有用的驗證規則;但是,你可以希望添加自己的驗證規則。其中一個方法就是使用Validator::extend函數註冊自定義的驗證規則;


註冊一個自定義的驗證規則

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

自定義的驗證器接受三個參數:待驗證屬性的名字,待驗證屬性的值以及傳遞給這個規則的參數。
你也可以牀底一個類的函數到extend函數,而不是使用閉包:

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

注意你需要爲你自定的規則定義錯誤消息。你既可以使用一個行內的自定義消息數組,也可以在驗證語言文件中進行添加。

你也可以擴展Validator類本身,而不是使用閉包回調擴展驗證器,爲了實現這個目的,添加一個繼承自Illuminate\Validation\Validator的驗證器類。你可以在類中添加validate開頭的驗證函數

擴展驗證器類

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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章