Laravel 的 Validation 检索验证错误消息

  • 基本用法
  • 处理错误消息
  • 错误消息和视图
  • 可用的验证规则
  • 有条件地添加规则
  • 自定义错误消息
  • 自定义验证规则

基本用法

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'
    )
);

创建验证程序实例后,可以使用fails(或passes)方法执行验证。

if ($validator->fails())
{
    //  给定的数据未通过验证 
}

如果验证失败,您可以从验证器检索错误消息。

$messages = $validator->messages();

您还可以访问一组失败的验证规则,而无需消息。为此,请使用失败的方法:

$failed = $validator->failed();
正在验证文件

Validator类提供了一些用于验证文件的规则,例如大小、mime和其他规则。在验证文件时,您可以简单地将它们与其他数据一起传递到验证器中。

处理错误消息

在对验证器实例调用了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>');

注意:默认情况下,消息使用与引导程序兼容的语法格式化。

检索格式为的所有错误消息
foreach ($messages->all('<li>:message</li>') as $message)
{
    //
}

错误消息和视图

一旦执行了验证,就需要一种简单的方法将错误消息返回到视图中。这是拉勒维尔很方便处理的。以下列路线为例:

Route::get('register', function()
{
    return View::make('user.register');
});

Route::post('register', function()
{
    $rules = array(...);

    $validator = Validator::make(Input::all(), $rules);

    if ($validator->fails())
    {
        return Redirect::to('register')->withErrors($validator);
    }
});

注意,当验证失败时,我们使用withErrors方法将验证程序实例传递给重定向。此方法将错误消息刷新到会话,以便在下次请求时可用。

但是,请注意,我们不必显式地将错误消息绑定到GET路由中的视图。这是因为Laravel将始终检查会话数据中的错误,并自动将它们绑定到视图(如果它们可用)。因此,需要注意的是,在您的所有视图中,每次请求时都会有一个$errors变量, 允许您方便地假设$errors变量始终是定义的并且可以安全地使用。$errors变量将是MessageBag的一个实例。

因此,重定向后,可以在视图中使用自动绑定的$errors变量:

<?php echo $errors->first('email'); ?>
命名错误包

如果在一个页面上有多个表单,您可能希望命名错误消息包。这将允许您检索特定表单的错误消息。只需将名称作为第二个参数传递给withErrors

return Redirect::to('register')->withErrors($validator, 'login');

然后,您可以从$errors变量访问命名的MessageBag实例:

<?php echo $errors->login->first('email'); ?>

可用的验证规则

以下是所有可用验证规则及其功能的列表:

  • Accepted
  • Active URL
  • After (Date)
  • Alpha
  • Alpha Dash
  • Alpha Numeric
  • Array
  • Before (Date)
  • Between
  • Boolean
  • Confirmed
  • Date
  • Date Format
  • Different
  • Digits
  • Digits Between
  • E-Mail
  • Exists (Database)
  • Image (File)
  • In
  • Integer
  • IP Address
  • Max
  • MIME Types
  • Min
  • Not In
  • Numeric
  • Regular Expression
  • Required
  • Required If
  • Required With
  • Required With All
  • Required Without
  • Required Without All
  • Same
  • Size
  • String
  • Timezone
  • Unique (Database)
  • URL
accepted

正在验证的字段必须是yes、on或1。这对于验证“服务条款”接受是有用的。

active_url

根据checkdnsrr PHP函数,正在验证的字段必须是有效的URL。

after:date

正在验证的字段必须是给定日期之后的值。日期将传递到PHP strtotime函数中。

alpha

正在验证的字段必须完全是字母字符。

alpha_dash

正在验证的字段可能包含字母数字字符以及破折号和下划线。

alpha_num

正在验证的字段必须完全是字母数字字符。

array

正在验证的字段必须是数组类型。

before:date

正在验证的字段必须是给定日期之前的值。日期将传递到PHP strtotime函数中。

between:min,max

正在验证的字段的大小必须介于给定的最小值和最大值之间。字符串、数字和文件的计算方式与大小规则相同。

boolean

验证中的字段必须能够转换为布尔值。接受的输入为true、false、1、0、“1”和“0”。

confirmed

正在验证的字段必须有一个匹配的foo_confirmation字段。例如,如果正在验证的字段是password,则输入中必须存在匹配的password_confirmation字段。

date

根据strtotime PHP函数,正在验证的字段必须是有效日期。

date_format:format

正在验证的字段必须与根据date_parse_from_format PHP函数定义的格式匹配。

different:field

给定字段必须与正在验证的字段不同。

digits:value

正在验证的字段必须是数字,并且必须具有精确的值长度。

digits_between:min,max

正在验证的字段的长度必须介于给定的最小值和最大值之间。

email

正在验证的字段必须格式化为电子邮件地址。

exists:table,column

正在验证的字段必须存在于给定的数据库表中。

Basic Usage Of Exists Rule
'state' => 'exists:states'
Specifying A Custom Column Name
'state' => 'exists:states,abbreviation'

您还可以指定更多将添加为查询的“where”子句的条件:

'email' => 'exists:staff,email,account_id,1'

NULL作为“where”子句值传递将添加对空数据库值的检查:

'email' => 'exists:staff,email,deleted_at,NULL'
image

正在验证的文件必须是图像(jpeg、png、bmp或gif)

in:foo,bar,...

验证中的字段必须包含在给定的值列表中。

integer

正在验证的字段必须具有整数值。

ip

正在验证的字段必须格式化为IP地址。

max:value

验证中的字段必须小于或等于最大值。字符串、数字和文件的计算方式与大小规则相同。

mimes:foo,bar,...

正在验证的文件必须具有与列出的扩展名之一对应的MIME类型。

Basic Usage Of MIME Rule
'photo' => 'mimes:jpeg,bmp,png'
min:value

正在验证的字段必须具有最小值。字符串、数字和文件的计算方式与大小规则相同。

not_in:foo,bar,...

正在验证的字段不能包含在给定的值列表中。

numeric

正在验证的字段必须有一个数值。

regex:pattern

正在验证的字段必须与给定的正则表达式匹配。

注意:使用regex模式时,可能需要在数组中指定规则,而不是使用管道分隔符,特别是当正则表达式包含管道字符时。

required

输入数据中必须存在正在验证的字段。

required_if:field,value,...

如果字段字段等于任何值,则必须存在正在验证的字段。

required_with:foo,bar,...

只有当任何其他指定字段存在时,验证中的字段才必须存在。

required_with_all:foo,bar,...

只有当所有其他指定字段都存在时,验证中的字段才必须存在。

required_without:foo,bar,...

只有当其他指定字段不存在时,验证中的字段才必须存在。

required_without_all:foo,bar,...

只有当所有其他指定字段都不存在时,验证中的字段才必须存在。

same:field

给定字段必须与正在验证的字段匹配。

size:value

正在验证的字段必须具有与给定值匹配的大小。对于字符串数据,值对应于字符数。对于数字数据,值对应于给定的整数值。对于文件,大小对应于以千字节为单位的文件大小。

string:value

正在验证的字段必须是字符串类型。

timezone

根据时区标识符列表PHP函数,正在验证的字段必须是有效的时区标识符。

unique:table,column,except,idColumn

在给定的数据库表中,要验证的字段必须是唯一的。如果未指定column选项,则将使用字段名。

Basic Usage Of Unique Rule
'email' => 'unique:users'
Specifying A Custom Column Name
'email' => 'unique:users,email_address'
Forcing A Unique Rule To Ignore A Given ID
'email' => 'unique:users,email_address,10'
Adding Additional Where Clauses

您还可以指定更多将添加为查询的“where”子句的条件:

'email' => 'unique:users,email_address,NULL,id,account_id,1'

在上述规则中,只有帐户id为1的行才会包含在唯一检查中。

url

正在验证的字段必须格式化为URL。

注意:此函数使用PHP的filter was方法。

有条件地添加规则

在某些情况下,您可能希望仅当输入数组中存在某个字段时才对该字段运行验证检查。要快速完成此操作,请将“有时”规则添加到规则列表中:

$v = Validator::make($data, array(
    'email' => 'sometimes|required|email',
));

在上面的示例中,只有当电子邮件字段出现在$data数组中时,才会对其进行验证。

复杂条件验证

有时,仅当另一个字段的值大于100时,才需要给定的字段。或者,只有当存在另一个字段时,才需要两个字段具有给定值。添加这些验证规则不一定很麻烦。首先,使用静态规则创建一个验证程序实例,这些规则永远不会更改:

$v = Validator::make($data, array(
    'email' => 'required|email',
    'games' => 'required|numeric',
));

假设我们的web应用程序是为游戏收藏者设计的。如果一个游戏收集器在我们的应用程序中注册,并且他们拥有100多个游戏,我们希望他们解释为什么他们拥有这么多游戏。例如,也许他们经营一家游戏转卖店,或者他们只是喜欢收藏。为了有条件地添加这个需求,我们可以在验证器实例上使用有时方法。

$v->sometimes('reason', 'required|max:500', function($input)
{
    return $input->games >= 100;
});

传递给有时方法的第一个参数是我们要条件验证的字段的名称。第二个参数是我们要添加的规则。如果作为第三个参数传递的闭包返回true,则将添加规则。这种方法使得建立复杂的条件验证变得轻而易举。您甚至可以同时为多个字段添加条件验证:

$v->sometimes(array('reason', 'cost'), 'required', function($input)
{
    return $input->games >= 100;
});

注意:传递给闭包的$input参数将是Illuminate\Support\Fluent的实例,可以用作访问输入和文件的对象。

自定义错误消息

如果需要,可以使用自定义错误消息进行验证,而不是使用默认值。有几种方法可以指定自定义消息。

将自定义消息传递到验证器
$messages = array(
    'required' => 'The :attribute field is required.',
);

$validator = Validator::make($input, $rules, $messages);

注意:属性占位符将替换为被验证字段的实际名称。您还可以在验证消息中使用其他占位符。

其他验证场所持有人
$messages = array(
    'same'    => 'The :attribute and :other must match.',
    'size'    => 'The :attribute must be exactly :size.',
    'between' => 'The :attribute must be between :min - :max.',
    'in'      => 'The :attribute must be one of the following types: :values',
);
为给定属性指定自定义消息

有时您可能希望仅为特定字段指定自定义错误消息:

$messages = array(
    'email.required' => 'We need to know your e-mail address!',
);
在语言文件中指定自定义消息

在某些情况下,您可能希望在语言文件中指定自定义消息,而不是将它们直接传递给验证器。为此,请将消息添加到app/lang/xx/validation.php语言文件中的自定义数组中。

'custom' => array(
    'email' => array(
        'required' => 'We need to know your e-mail address!',
    ),
),

自定义验证规则

注册自定义验证规则

Laravel提供了各种有用的验证规则;但是,您可能希望指定一些自己的验证规则。注册自定义验证规则的一种方法是使用Validator::extend方法:

Validator::extend('foo', function($attribute, $value, $parameters)
{
    return $value == 'foo';
});

自定义验证器闭包接收三个参数:正在验证的$attribute的名称、属性的$value$param数组

您还可以将类和方法传递给扩展方法而不是闭包:

Validator::extend('foo', 'FooValidator@validate');

请注意,您还需要为自定义规则定义错误消息。可以使用内联自定义消息数组或通过在验证语言文件中添加条目来执行此操作。

扩展验证器类

与使用闭包回调来扩展验证器不同,您还可以扩展验证器类本身。为此,请编写一个扩展Illuminate\Validation\Validator的验证程序类。可以通过将验证方法添加到类中,然后用验证:

<?php

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);
}

如果要添加自定义消息“replacer”而不扩展Validator类,可以使用Validator::replacer方法:

Validator::replacer('rule', function($message, $attribute, $rule, $parameters)
{
    //
});
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!