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@example.com'
),
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);
}