- 基本用法
- 处理错误消息
- 错误消息和视图
- 可用的验证规则
- 有条件地添加规则
- 自定义错误消息
- 自定义验证规则
基本用法
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)
{
//
}
错误消息和视图
一旦执行了验证,就需要一种简单的方法将错误消息返回到视图中。这是laravel很方便处理的。以下列路线为例:
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
- 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
正在验证的字段的长度必须介于给定的最小值和最大值之间。
正在验证的字段必须格式化为电子邮件地址。
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参数将是IlluminateSupportFluent的实例,可以用作访问输入和文件的对象。
自定义错误消息
如果需要,可以使用自定义错误消息进行验证,而不是使用默认值。有几种方法可以指定自定义消息。
将自定义消息传递到验证器
$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');
请注意,您还需要为自定义规则定义错误消息。可以使用内联自定义消息数组或通过在验证语言文件中添加条目来执行此操作。
扩展验证器类
与使用闭包回调来扩展验证器不同,您还可以扩展验证器类本身。为此,请编写一个扩展IlluminateValidationValidator
的验证程序类。可以通过将验证方法添加到类中,然后用验证:
<?php
class CustomValidator extends IlluminateValidationValidator {
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)
{
//
});