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)函数执行这个验证。
文件验证 Validator类提供了一些验证规则用于验证文件,比如size、mimes等。在验证文件的时候,您可以和其他验证一样传递给验证器。 附带错误消息 在一个Validator实例上调用messages函数之后,将会得到一个MessageBag实例,该实例拥有很多处理错误消息的方便的函数。 获取一个域的第一个错误消息 获取一个域的全部错误消息 获取全部域的全部错误消息 检查一个域是否存在消息 以某种格式获取所有错误消息 错误消息&视图 一旦您执行了验证,您需要一种简单的方法向视图反馈错误消息。这在Lavavel中能够方便的处理。以下面的路由作为例子: 然而,注意我们没有必要明确的在GET路由中绑定错误消息到路由。这是因为Laravel总会检查Session中的错误,并自动绑定它们到视图如果它们是可用的。所以,对于每个请求,一个$errors变量在所有视图中总是可用的,允许您方便的认为$errors总是被定义并可以安全使用的。$errors变量将是一个MessageBag类的实例。 所以,在跳转之后,您可以在视图中使用自动绑定的$errors变量: 下面是一个所有可用的验证规则的列表以及它们的功能: accepted 验证此规则的值必须是yes、on或者是1。这在验证是否同意"服务条款"的时候非常有用。 active_url 验证此规则的值必须是一个合法的URL,根据PHP函数checkdnsrr。 after:date 验证此规则的值必须在给定日期之后,日期将通过PHP函数strtotime传递。 alpha alpha_dash alpha_num before:date between:min,max confirmed date date_format:format different:field email exists:table,column Exists规则的基础使用 image in:foo,bar,... 验证此规则的值必须在给定的列表中存在。 integer 验证此规则的值必须是一个整数。 max:value 验证此规则的值必须小于最大值value。字符串、数字以及文件都将使用大小规则进行比较。 mimes:foo,bar,... 验证此规则的文件的MIME类型必须在给定的列表中。 MIME规则的基础使用 min: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:table,column,except,idColumn 验证此规则的值必须在给定的数据库的表中唯一。如果column没有被指定,将使用该域的名字。 Unique规则的基础使用 url 验证此规则的值必须是一个合法的URL。 定制错误消息 如果有需要,您可以使用定制的错误消息代替默认的消息。这里有好几种定制错误消息的方法。 传递定制消息到验证器 注意::attribute占位符将被实际的进行验证的域的名字代替,您也可以在错误消息中使用其他占位符。 其他验证占位符 对一个指定的域指定定制的错误消息 在语言文件中指定错误消息 定制验证规则 Laravel提供了一系列的有用的验证规则;但是,您可能希望添加自己的验证规则。其中一种方法是使用Validator::extend函数注册定制的验证规则: 注册一个定制的验证规则 注意:传递给extend函数的规则的名字必须符合"snakecased"命名规则。 定制的验证器接受三个参数:待验证属性的名字、待验证属性的值以及传递给这个规则的参数。 您也可以传递一个类的函数到extend函数,而不是使用闭包: 您也可以扩展Validator类本身,而不是使用闭包回调扩展验证器。为了实现这个目的,添加一个继承自Illuminate\Validation\Validator的验证器类。您可以添加在类中添加以validate开头的验证函数: 扩展验证器类 下面,您需要注册定制的验证器扩展: 您需要注册定制的验证器扩展 当创建一个定制的验证规则,您有时需要为错误消息定义一个定制的占位符。为了实现它,您可以像上面那样创建一个定制的验证器,并且在验证器中添加一个replaceXXX函数:
if($validator->fails())
{
//Thegivendatadidnotpassvalidation
}
如果验证失败,您可以从验证器中获取错误消息。
$messages=$validator->messages();
您也可以使用failed函数得到不带错误消息的没有通过验证的规则的数组。
$failed=$validator->failed();
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)
{
//
}
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中保存的错误消息,使得在下次请求中能够可用。
<?phpecho$errors->first("email");?>
可用的验证规则
Accepted
ActiveURL
After(Date)
Alpha
AlphaDash
AlphaNumeric
Before(Date)
Between
Confirmed
Date
DateFormat
Different
E-Mail
Exists(Database)
Image(File)
In
Integer
IPAddress
Max
MIMETypes
Min
NotIn
Numeric
RegularExpression
Required
RequiredIf
RequiredWith
RequiredWithout
Same
Size
Unique(Database)
验证此规则的值必须全部由字母字符构成。
验证此规则的值必须全部由字母、数字、中划线或下划线字符构成。
验证此规则的值必须全部由字母和数字构成。
验证此规则的值必须在给定日期之前,日期将通过PHP函数strtotime传递。
验证此规则的值必须在给定的min和max之间。字符串、数字以及文件都将使用大小规则进行比较。
验证此规则的值必须和foo_confirmation的值相同。比如,需要验证此规则的域是password,那么在输入中必须有一个与之相同的password_confirmation域。
验证此规则的值必须是一个合法的日期,根据PHP函数strtotime。
验证此规则的值必须符合给定的format的格式,根据PHP函数date_parse_from_format。
验证此规则的值必须与指定的field域的值不同。
验证此规则的值必须是一个合法的电子邮件地址。
验证此规则的值必须在指定的数据库的表中存在。
指定列名
"state"=>"exists:states,abbreviation"
您也可以指定更多的条件,将以"where"的形式添加到查询。
"email"=>"exists:staff,email,account_id,1"
验证此规则的值必须是一个图片(jpeg,png,bmp或者gif)。
验证此规则的值必须是一个合法的IP地址。
"photo"=>"mimes:jpeg,bmp,png"
验证此规则的值必须大于最小值value。字符串、数字以及文件都将使用大小规则进行比较。
"email"=>"unique:users"
指定列名
"email"=>"unique:users,email_address"
强制忽略一个给定的ID
"email"=>"unique:users,email_address,10"
$messages=array(
"required"=>"The:attributefieldisrequired.",
);
$validator=Validator::make($input,$rules,$messages);
$messages=array(
"same"=>"The:attributeand:othermustmatch.",
"size"=>"The:attributemustbeexactly:size.",
"between"=>"The:attributemustbebetween:min-:max.",
"in"=>"The:attributemustbeoneofthefollowingtypes:
:values",
);
有些时候,您可能希望只对一个指定的域指定定制的错误消息:
$messages=array(
"email.required"=>"Weneedtoknowyoure-mailaddress!",
);
在一些情况下,您可能希望在一个语言文件中指定错误消息而不是直接传递给Validator。为了实现这个目的,请在app/lang/xx/validation.php文件中添加您的定制消息到custom数组。
"custom"=>array(
"email"=>array(
"required"=>"Weneedtoknowyoure-mailaddress!",
),
),
Validator::extend("foo",function($attribute,$value,$parameters)
{
return$value=="foo";
});
Validator::extend("foo","FooValidator@validate");
注意您需要为您的定制规则定义错误消息。您既可以使用一个行内的定制消息数组,也可以在验证语言文件中进行添加。
<?php
classCustomValidatorextendsIlluminate\Validation\Validator{
publicfunctionvalidateFoo($attribute,$value,$parameters)
{
return$value=="foo";
}
}
Validator::resolver(function($translator,$data,$rules,$messages)
{
returnnewCustomValidator($translator,$data,$rules,$messages);
});
protectedfunctionreplaceFoo($message,$attribute,$rule,$parameters)
{
returnstr_replace(":foo",$parameters[0],$message);
}
相关文章