Laravel框架表单验证详解
复制代码代码如下:
$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实例被创建,可以使用fails(或者passes)函数执行这个验证。
复制代码代码如下:
if($validator->fails()){//Thegivendatadidnotpassvalidation}
如果验证失败,您可以从验证器中获取错误消息。
复制代码代码如下:
$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'','':message '');
注意:默认情况下,消息将使用与Bootstrap兼容的语法进行格式化。
以某种格式获取所有错误消息
复制代码代码如下:
foreach($messages->all('':message'')as$message){//}
错误消息&视图
一旦您执行了验证,您需要一种简单的方法向视图反馈错误消息。这在Lavavel中能够方便的处理。以下面的路由作为例子:
复制代码代码如下:
Route::get(''register'',function(){returnView::make(''user.register'');});Route::post(''register'',function(){$rules=array(...);$validator=Validator::make(Input::all(),$rules);if($validator->fails()){returnRedirect::to(''register'')->withErrors($validator);}});
注意当验证失败,我们使用withErrors函数把Validator实例传递给Redirect。这个函数将刷新Session中保存的错误消息,使得在下次请求中能够可用。
然而,注意我们没有必要明确的在GET路由中绑定错误消息到路由。这是因为Laravel总会检查Session中的错误,并自动绑定它们到视图如果它们是可用的。所以,对于每个请求,一个$errors变量在所有视图中总是可用的,允许您方便的认为$errors总是被定义并可以安全使用的。$errors变量将是一个MessageBag类的实例。
所以,在跳转之后,您可以在视图中使用自动绑定的$errors变量:
复制代码代码如下:
first(''email'');?>
可用的验证规则
下面是一个所有可用的验证规则的列表以及它们的功能:
复制代码代码如下:
AcceptedActiveURLAfter(Date)AlphaAlphaDashAlphaNumericBefore(Date)BetweenConfirmedDateDateFormatDifferentE-MailExists(Database)Image(File)InIntegerIPAddressMaxMIMETypesMinNotInNumericRegularExpressionRequiredRequiredIfRequiredWithRequiredWithoutSameSizeUnique(Database)
accepted
验证此规则的值必须是yes、on或者是1。这在验证是否同意"服务条款"的时候非常有用。
active_url
验证此规则的值必须是一个合法的URL,根据PHP函数checkdnsrr。
after:date
验证此规则的值必须在给定日期之后,日期将通过PHP函数strtotime传递。
alpha验证此规则的值必须全部由字母字符构成。
alpha_dash验证此规则的值必须全部由字母、数字、中划线或下划线字符构成。
alpha_num验证此规则的值必须全部由字母和数字构成。
before:date验证此规则的值必须在给定日期之前,日期将通过PHP函数strtotime传递。
between:min,max验证此规则的值必须在给定的min和max之间。字符串、数字以及文件都将使用大小规则进行比较。
confirmed验证此规则的值必须和foo_confirmation的值相同。比如,需要验证此规则的域是password,那么在输入中必须有一个与之相同的password_confirmation域。
date验证此规则的值必须是一个合法的日期,根据PHP函数strtotime。
date_format:format验证此规则的值必须符合给定的format的格式,根据PHP函数date_parse_from_format。
different:field验证此规则的值必须与指定的field域的值不同。
email验证此规则的值必须是一个合法的电子邮件地址。
exists:table,column验证此规则的值必须在指定的数据库的表中存在。
Exists规则的基础使用
复制代码代码如下:
''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地址。
max:value
验证此规则的值必须小于最大值value。字符串、数字以及文件都将使用大小规则进行比较。
mimes:foo,bar,...
验证此规则的文件的MIME类型必须在给定的列表中。
MIME规则的基础使用
复制代码代码如下:
''photo''=>''mimes:jpeg,bmp,png''
min:value验证此规则的值必须大于最小值value。字符串、数字以及文件都将使用大小规则进行比较。
not_in:foo,bar,...
验证此规则的值必须在给定的列表中不存在。
numeric
验证此规则的值必须是一个数字。
regex:pattern
验证此规则的值必须符合给定的正则表达式。
注意:当使用regex模式的时候,有必要使用数组指定规则,而不是管道分隔符,特别是正则表达式中包含一个管道字符的时候。
required
验证此规则的值必须在输入数据中存在。
required_if:field,value
当指定的域为某个值的时候,验证此规则的值必须存在。
required_with:foo,bar,...
仅当指定的域存在的时候,验证此规则的值必须存在。
required_without:foo,bar,...
仅当指定的域不存在的时候,验证此规则的值必须存在。
same:field
验证此规则的值必须与给定域的值相同。
size:value
验证此规则的值的大小必须与给定的value相同。对于字符串,value代表字符的个数;对于数字,value代表它的整数值,对于文件,value代表文件以KB为单位的大小。
unique:www.hunanwang.netColumn
验证此规则的值必须在给定的数据库的表中唯一。如果column没有被指定,将使用该域的名字。
Unique规则的基础使用
复制代码代码如下:
''email''=>''unique:users''指定列名''email''=>''unique:users,email_address''强制忽略一个给定的ID''email''=>''unique:users,email_address,10''
url
验证此规则的值必须是一个合法的URL。
定制错误消息
如果有需要,您可以使用定制的错误消息代替默认的消息。这里有好几种定制错误消息的方法。
传递定制消息到验证器
复制代码代码如下:
$messages=array(''required''=>''The:attributefieldisrequired.'',);$validator=Validator::make($input,$rules,$messages);
注意::attribute占位符将被实际的进行验证的域的名字代替,您也可以在错误消息中使用其他占位符。
其他验证占位符
复制代码代码如下:
$messages=array(''same''=>''The:attributeand:othermustmatch.'',''size''=>''The:attributemustbeexactly:size.'',''between''=>''The:attributemustbebetween:min-:max.'',''in''=>''The:attributemwww.visa158.comfollowingtypes::values'',);
有些时候,您可能希望只对一个指定的域指定定制的错误消息:
对一个指定的域指定定制的错误消息
复制代码代码如下:
$messages=array(''email.required''=>''Weneedtoknowyoure-mailaddress!'',);
在一些情况下,您可能希望在一个语言文件中指定错误消息而不是直接传递给Validator。为了实现这个目的,请在app/lang/xx/validation.php文件中添加您的定制消息到custom数组。
在语言文件中指定错误消息
复制代码代码如下:
''custom''=>array(''email''=>array(''required''=>''Weneedtoknowyoure-mailaddress!'',),),
定制验证规则
Laravel提供了一系列的有用的验证规则;但是,您可能希望添加自己的验证规则。其中一种方法是使用Validator::extend函数注册定制的验证规则:
注册一个定制的验证规则
复制代码代码如下:
Validator::extend(''foo'',function($attribute,$value,$parameters){return$value==''foo'';});
注意:传递给extend函数的规则的名字必须符合"snakecased"命名规则。
定制的验证器接受三个参数:待验证属性的名字、待验证属性的值以及传递给这个规则的参数。
您也可以传递一个类的函数到extend函数,而不是使用闭包:
复制代码代码如下:
Validator::extend(''foo'',''FooValidator@validate'');
注意您需要为您的定制规则定义错误消息。您既可以使用一个行内的定制消息数组,也可以在验证语言文件中进行添加。
您也可以扩展Validator类本身,而不是使用闭包回调扩展验证器。为了实现这个目的,添加一个继承自Illuminate\Validation\Validator的验证器类。您可以添加在类中添加以validate开头的验证函数:
扩展验证器类
复制代码代码如下:
下面,您需要注册定制的验证器扩展:
您需要注册定制的验证器扩展
复制代码代码如下:
Validator::resolver(function($translator,$data,$rules,$messages){returnnewCustomValidator($translator,$data,$rules,$messages);});
当创建一个定制的验证规则,您有时需要为错误消息定义一个定制的占位符。为了实现它,您可以像上面那样创建一个定制的验证器,并且在验证器中添加一个replaceXXX函数:
复制代码代码如下:
protectedfunctionreplaceFoo($message,$attribute,$rule,$parameters){returnstr_replace('':foo'',$parameters[0],$message);}
|
|