zl程序教程

您现在的位置是:首页 >  前端

当前栏目

Laravel框架表单验证详解

框架 详解 验证 表单 laravel
2023-06-13 09:15:45 时间

基础验证例子

复制代码代码如下:


$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","<p>:message</p>");

  注意:默认情况下,消息将使用与Bootstrap兼容的语法进行格式化。

  以某种格式获取所有错误消息

复制代码代码如下:
  foreach($messages->all("<li>:message</li>")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变量:

复制代码代码如下:
<?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)

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:table,column,except,idColumn

验证此规则的值必须在给定的数据库的表中唯一。如果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:attributemustbeoneofthefollowingtypes:
: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开头的验证函数:

扩展验证器类

复制代码代码如下:
<?php
classCustomValidatorextendsIlluminate\Validation\Validator{
publicfunctionvalidateFoo($attribute,$value,$parameters)
{
return$value=="foo";
}
}

下面,您需要注册定制的验证器扩展:

您需要注册定制的验证器扩展

复制代码代码如下:
Validator::resolver(function($translator,$data,$rules,$messages)
{
returnnewCustomValidator($translator,$data,$rules,$messages);
});

  当创建一个定制的验证规则,您有时需要为错误消息定义一个定制的占位符。为了实现它,您可以像上面那样创建一个定制的验证器,并且在验证器中添加一个replaceXXX函数:

复制代码代码如下:
protectedfunctionreplaceFoo($message,$attribute,$rule,$parameters)
{
returnstr_replace(":foo",$parameters[0],$message);
}