配色: 字号:
Laravel框架表单验证详解
2016-08-26 | 阅:  转:  |  分享 
  
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);}



    献花(0)
    +1
    (本文系爱就请温柔...首藏)