Skip to content

验证

基本用法

Laravel 提供了一个简单、方便的功能,用于验证数据并通过 Validation 类检索验证错误消息。

基本验证示例

php
$validator = Validator::make(
	array('name' => 'Dayle'),
	array('name' => 'required|min:5')
);

传递给 make 方法的第一个参数是待验证的数据。第二个参数是应应用于数据的验证规则。

使用数组指定规则

多个规则可以使用“管道”字符分隔,或作为数组的单独元素。

php
$validator = Validator::make(
	array('name' => 'Dayle'),
	array('name' => array('required', 'min:5'))
);

验证多个字段

php
$validator = Validator::make(
    array(
        'name' => 'Dayle',
        'password' => 'lamepassword',
        'email' => 'email@example.com'
    ),
    array(
        'name' => 'required',
        'password' => 'required|min:8',
        'email' => 'required|email|unique:users'
    )
);

一旦创建了 Validator 实例,可以使用 fails(或 passes)方法执行验证。

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

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

php
$messages = $validator->messages();

您还可以访问没有消息的失败验证规则数组。为此,请使用 failed 方法:

php
$failed = $validator->failed();

验证文件

Validator 类提供了多种规则来验证文件,例如 sizemimes 等。在验证文件时,您可以将它们与其他数据一起传递给验证器。

处理错误消息

Validator 实例上调用 messages 方法后,您将收到一个 MessageBag 实例,该实例具有多种方便的方法来处理错误消息。

检索字段的第一个错误消息

php
echo $messages->first('email');

检索字段的所有错误消息

php
foreach ($messages->get('email') as $message)
{
	//
}

检索所有字段的所有错误消息

php
foreach ($messages->all() as $message)
{
	//
}

确定字段是否存在消息

php
if ($messages->has('email'))
{
	//
}

以格式检索错误消息

php
echo $messages->first('email', '<p>:message</p>');
lightbulb

默认情况下,消息使用与 Bootstrap 兼容的语法格式化。

以格式检索所有错误消息

php
foreach ($messages->all('<li>:message</li>') as $message)
{
	//
}

错误消息与视图

一旦您执行了验证,您将需要一种简单的方法将错误消息返回到视图。这由 Laravel 方便地处理。考虑以下路由作为示例:

php
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 方法将 Validator 实例传递给重定向。此方法将错误消息闪存到会话中,以便在下一个请求中可用。

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

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

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

命名错误包

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

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

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

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

可用的验证规则

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

accepted

被验证的字段必须是 yeson1。这对于验证“服务条款”接受非常有用。

active_url

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

after:date

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

alpha

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

alpha_dash

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

alpha_num

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

array

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

before:date

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

between:min,max

被验证的字段必须在给定的 minmax 之间。字符串、数字和文件的评估方式与 size 规则相同。

boolean

被验证的字段必须能够被转换为布尔值。接受的输入为 truefalse10"1""0"

confirmed

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

date

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

date_format:format

被验证的字段必须与根据 date_parse_from_format PHP 函数定义的 format 匹配。

different:field

给定的 field 必须与被验证的字段不同。

digits:value

被验证的字段必须是 numeric 并且必须具有 value 的确切长度。

digits_between:min,max

被验证的字段必须具有在给定的 minmax 之间的长度。

email

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

exists:table,column

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

存在规则的基本用法

php
'state' => 'exists:states'

指定自定义列名

php
'state' => 'exists:states,abbreviation'

您还可以指定更多条件,这些条件将作为“where”子句添加到查询中:

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

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

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

image

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

in:foo,bar,...

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

integer

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

ip

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

max:value

被验证的字段必须小于或等于最大 value。字符串、数字和文件的评估方式与 size 规则相同。

mimes:foo,bar,...

被验证的文件必须具有与列出的扩展名相对应的 MIME 类型。

MIME 规则的基本用法

php
'photo' => 'mimes:jpeg,bmp,png'

min:value

被验证的字段必须具有最小 value。字符串、数字和文件的评估方式与 size 规则相同。

not_in:foo,bar,...

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

numeric

被验证的字段必须具有数字值。

regex:pattern

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

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

required

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

required_if:field,value,...

被验证的字段必须存在,如果 field 字段等于任何 value

required_with:foo,bar,...

被验证的字段必须仅在任何其他指定字段存在时存在。

required_with_all:foo,bar,...

被验证的字段必须仅在所有其他指定字段存在时存在。

required_without:foo,bar,...

被验证的字段必须仅在任何其他指定字段不存在时存在。

required_without_all:foo,bar,...

被验证的字段必须仅在所有其他指定字段都不存在时存在。

same:field

给定的 field 必须与被验证的字段匹配。

size:value

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

string:value

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

timezone

被验证的字段必须是根据 timezone_identifiers_list PHP 函数的有效时区标识符。

unique:table,column,except,idColumn

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

唯一规则的基本用法

php
'email' => 'unique:users'

指定自定义列名

php
'email' => 'unique:users,email_address'

强制唯一规则忽略给定 ID

php
'email' => 'unique:users,email_address,10'

添加额外的 Where 子句

您还可以指定更多条件,这些条件将作为“where”子句添加到查询中:

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

在上面的规则中,只有 account_id1 的行将包含在唯一检查中。

url

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

lightbulb

此函数使用 PHP 的 filter_var 方法。

有条件地添加规则

在某些情况下,您可能希望仅在输入数组中存在该字段时对字段进行验证检查。要快速实现此目的,请将 sometimes 规则添加到您的规则列表中:

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

在上面的示例中,只有在 $data 数组中存在 email 字段时,才会对其进行验证。

复杂条件验证

有时您可能希望仅在另一个字段的值大于 100 时才需要给定字段。或者您可能需要两个字段在另一个字段存在时具有给定值。添加这些验证规则并不麻烦。首先,使用您的 static rules 创建一个 Validator 实例,这些规则永远不会改变:

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

假设我们的网络应用程序是为游戏收藏者服务的。如果游戏收藏者注册了我们的应用程序,并且他们拥有超过 100 个游戏,我们希望他们解释为什么他们拥有这么多游戏。例如,也许他们经营一个游戏转售商店,或者他们只是喜欢收藏。要有条件地添加此要求,我们可以在 Validator 实例上使用 sometimes 方法。

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

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

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

传递给您的 Closure$input 参数将是 Illuminate\Support\Fluent 的一个实例,可以用作对象来访问您的输入和文件。

自定义错误消息

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

将自定义消息传递给验证器

php
$messages = array(
	'required' => '字段 :attribute 是必填的。',
);

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

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

其他验证占位符

php
$messages = array(
	'same'    => ':attribute 和 :other 必须匹配。',
	'size'    => ':attribute 必须正好是 :size。',
	'between' => ':attribute 必须在 :min - :max 之间。',
	'in'      => ':attribute 必须是以下类型之一::values',
);

为给定属性指定自定义消息

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

php
$messages = array(
	'email.required' => '我们需要知道您的电子邮件地址!',
);

在语言文件中指定自定义消息

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

php
'custom' => array(
	'email' => array(
		'required' => '我们需要知道您的电子邮件地址!',
	),
),

自定义验证规则

注册自定义验证规则

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

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

自定义验证器闭包接收三个参数:被验证的 $attribute 的名称、属性的 $value 和传递给规则的 $parameters 数组。

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

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

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

扩展验证器类

除了使用闭包回调扩展验证器外,您还可以扩展验证器类本身。为此,编写一个扩展 Illuminate\Validation\Validator 的验证器类。您可以通过在方法名前加上 validate 前缀来向类添加验证方法:

php
<?php

class CustomValidator extends Illuminate\Validation\Validator {

	public function validateFoo($attribute, $value, $parameters)
	{
		return $value == 'foo';
	}

}

注册自定义验证器解析器

接下来,您需要注册自定义验证器扩展:

php
Validator::resolver(function($translator, $data, $rules, $messages)
{
	return new CustomValidator($translator, $data, $rules, $messages);
});

在创建自定义验证规则时,您有时需要为错误消息定义自定义占位符替换。您可以通过上述方式创建自定义验证器,并向验证器添加 replaceXXX 函数来做到这一点。

php
protected function replaceFoo($message, $attribute, $rule, $parameters)
{
	return str_replace(':foo', $parameters[0], $message);
}

如果您希望在不扩展 Validator 类的情况下添加自定义消息“替换器”,您可以使用 Validator::replacer 方法:

php
Validator::replacer('rule', function($message, $attribute, $rule, $parameters)
{
	//
});