Validation
Introduction
验证可用于交叉检查数据并通过将数据提供给Validator
班级。验证与Validator
类可用于表单提交、查询字符串数据和其他来源,以及模型验证(请参见下面的注释)。文档的这一部分解释了如何使用Validator
在您的项目中定位、自定义和执行验证的类。
本节用于详细验证
Validator
班级。通过特征处理验证模型的方式略有不同。请参阅验证特征 部分了解有关验证模型的更多信息。
基本用法
验证器类是一个简单、方便的工具,用于验证数据和通过Validator
班级。
基本验证示例
$validator = Validator::make(
['name' => 'Joe'],
['name' => 'required|min:5']
);
第一个参数传递给make
方法是正在验证的数据。第二个参数是应用于数据的验证规则。
使用数组指定规则
可以使用“管道”字符或作为数组的单独元素来分隔多个规则。
$validator = Validator::make(
['name' => 'Joe'],
['name' => ['required', 'min:5']]
);
验证多个字段
$validator = Validator::make(
[
'name' => 'Joe',
'password' => 'lamepassword',
'email' => 'email@example.com'
],
[
'name' => 'required',
'password' => 'required|min:8',
'email' => 'required|email|unique:users'
]
);
一旦Validator
实例已经创建,fails
(或者passes
) 方法可用于执行验证。
if ($validator->fails()) {
// The given data did not pass validation
}
如果验证失败,您可以从验证器中检索错误消息。
$messages = $validator->messages();
您还可以访问一组失败的验证规则,但没有消息。为此,请使用failed
方法:
$failed = $validator->failed();
验证文件
这Validator
类提供了几个验证文件的规则,例如size
,mimes
, 和别的。验证文件时,您可以简单地将它们与其他数据一起传递给验证器。
使用错误消息
调用后messages
上的方法Validator
例如,您将收到Illuminate\Support\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>');
NOTE: 默认情况下,消息使用 Bootstrap 兼容语法进行格式化。
使用某种格式检索所有错误消息
foreach ($messages->all('<li>:message</li>') as $message) {
//
}
错误消息和视图
执行验证后,您将需要一种简单的方法将错误消息返回给您的视图。这由 Winter 很方便地处理。以以下路由为例:
public function onRegister()
{
$rules = [];
$validator = Validator::make(Input::all(), $rules);
if ($validator->fails()) {
return Redirect::to('register')->withErrors($validator);
}
}
请注意,当验证失败时,我们通过Validator
使用重定向的实例withErrors
方法。此方法会将错误消息闪烁到会话中,以便它们在下一个请求中可用。
Winter 将始终检查会话数据中的错误,并在它们可用时自动将它们绑定到视图。因此,重要的是要注意errors
每次请求时,变量将始终在您的所有页面中可用,让您方便地假设errors
变量总是被定义并且可以安全地使用。这errors
变量将是一个实例MessageBag
.
因此,重定向后,您可以使用自动绑定errors
您视图中的变量:
{{ errors.first('email') }}
命名错误包
如果您在一个页面上有多个表单,您可能希望将MessageBag
的错误。这将允许您检索特定表单的错误消息。只需将名称作为第二个参数传递给withErrors
:
return Redirect::to('register')->withErrors($validator, 'login');
然后您可以访问指定的MessageBag
实例来自$errors
多变的:
{{ errors.login.first('email') }}
可用的验证规则
以下是所有可用验证规则及其功能的列表:
accepted
验证中的字段必须是yes,on, 或者1.这对于验证“服务条款”接受度很有用。
active_url
验证字段必须是有效的 URLcheckdnsrr
PHP函数。
after:date
验证字段必须是给定日期之后的值。日期将被传递到 PHPstrtotime
功能。
alpha
验证字段必须完全是字母字符。
alpha_dash
验证字段可能包含字母数字字符,以及破折号和下划线。
alpha_num
验证字段必须完全是字母数字字符。
array
验证字段必须是数组类型。
before:date
验证字段必须是给定日期之前的值。日期将被传递到 PHPstrtotime
功能。
between:min,max
验证字段的大小必须介于给定的min 和max.字符串、数字和文件的计算方式与size
规则。
boolean
验证中的字段必须能够转换为布尔值。接受的输入是true
,false
,1
,0
,"1"
和"0"
.
confirmed
正在验证的字段必须具有匹配字段foo_confirmation
.例如,如果正在验证的字段是password
, 一个匹配password_confirmation
字段必须存在于输入中。
date
验证字段必须是有效日期strtotime
PHP函数。
date_format:format
验证中的字段必须匹配format 根据定义date_parse_from_format
PHP函数。
different:field
给定的field 必须不同于验证中的字段。
digits:value
验证中的字段必须是numeric 并且必须有一个确切的长度value.
digits_between:min,max
验证字段的长度必须介于给定的min 和max.
验证字段的格式必须为电子邮件地址。
exists:table,column
验证中的字段必须存在于给定的数据库表中。
存在规则的基本用法
'state' => 'exists:states'
指定自定义列名称
'state' => 'exists:states,abbreviation'
您还可以指定更多条件,这些条件将作为“where”子句添加到查询中:
'email' => 'exists:staff,email,account_id,1'
通过NULL
作为“where”子句值将添加一个检查NULL
数据库值:
'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规则的基本用法
'photo' => 'mimes:jpeg,bmp,png'
min:value
正在验证的字段必须至少有value.字符串、数字和文件的计算方式与size
规则。
not_in:foo,bar,...
验证中的字段不得包含在给定的值列表中。
nullable
正在验证的字段可能是null
.这在验证原语时特别有用,例如可以包含的字符串和整数null
值。
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
未指定选项,将使用字段名称。
唯一规则的基本用法
'email' => 'unique:users'
指定自定义列名称
'email' => 'unique:users,email_address'
强制唯一规则忽略给定的 ID
'email' => 'unique:users,email_address,10'
添加额外的 where 子句
您还可以指定更多条件,这些条件将作为“where”子句添加到查询中:
'email' => 'unique:users,email_address,NULL,id,account_id,1'
在上面的规则中,只有带有account_id
的1
将包含在独特的支票中。
url
验证字段必须格式化为 URL。
NOTE: 这个函数使用 PHP 的
filter_var
方法。
有条件地添加规则
在某些情况下,您可能希望对字段运行验证检查only 如果该字段存在于输入数组中。要快速完成此操作,请添加sometimes
规则到您的规则列表:
$v = Validator::make($data, [
'email' => 'sometimes|required|email',
]);
在上面的例子中,email
字段只有在存在于$data
大批。
复杂的条件验证
有时您可能希望仅当另一个字段的值大于 100 时才需要给定字段。或者您可能需要两个字段只有在另一个字段存在时才具有给定值。添加这些验证规则并不一定很痛苦。首先,创建一个Validator
与你的实例静态规则 永远不会改变:
$v = Validator::make($data, [
'email' => 'required|email',
'games' => 'required|numeric',
]);
假设我们的 Web 应用程序适用于游戏收藏家。如果游戏收藏家在我们的应用程序中注册并且他们拥有 100 多款游戏,我们希望他们解释为什么他们拥有这么多游戏。例如,也许他们经营一家游戏转售店,或者他们可能只是喜欢收集。要有条件地添加此要求,我们可以使用sometimes
上的方法Validator
实例。
$v->sometimes('reason', 'required|max:500', function($input) {
return $input->games >= 100;
});
第一个参数传递给sometimes
method 是我们有条件验证的字段的名称。第二个参数是我们要添加的规则。如果Closure
作为第三个参数返回传递true
, 将添加规则。这种方法使得构建复杂的条件验证变得轻而易举。您甚至可以同时为多个字段添加条件验证:
$v->sometimes(['reason', 'cost'], 'required', function($input) {
return $input->games >= 100;
});
NOTE: 这
$input
传递给你的参数Closure
将是一个实例Illuminate\Support\Fluent
并且可以用作访问您的输入和文件的对象。
验证数组
验证基于数组的表单输入字段并不一定很痛苦。您可以使用“点符号”来验证数组中的属性。例如,如果传入的 HTTP 请求包含photos[profile]
字段,您可以像这样验证它:
$validator = Validator::make(Input::all(), [
'photos.profile' => 'required|image',
]);
您还可以验证数组的每个元素。例如,要验证给定数组输入字段中的每封电子邮件都是唯一的,您可以执行以下操作:
$validator = Validator::make(Input::all(), [
'person.*.email' => 'email|unique:users',
'person.*.first_name' => 'required_with:person.*.last_name',
]);
同样,您可以使用*
在语言文件中指定验证消息时的字符,使得对基于数组的字段使用单个验证消息变得轻而易举:
'custom' => [
'person.*.email' => [
'unique' => 'Each person must have a unique e-mail address',
]
],
如果愿意,您也可以在验证规则中使用“数组表示法”。这些规则将在验证时自动转换为“点符号”。
$validator = Validator::make(Input::all(), [
'photos[profile]' => 'required|image',
'person[][email]' => 'email|unique:users',
]);
自定义错误消息
如果需要,您可以使用自定义错误消息而不是默认值进行验证。有几种方法可以指定自定义消息。
将自定义消息传递给验证器
$messages = [
'required' => 'The :attribute field is required.',
];
$validator = Validator::make($input, $rules, $messages);
Note: 这
:attribute
占位符将被验证字段的实际名称替换。您还可以在验证消息中使用其他占位符。
其他验证占位符
$messages = [
'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 = [
'email.required' => 'We need to know your e-mail address!',
];
在语言文件中指定自定义消息
在某些情况下,您可能希望在语言文件中指定您的自定义消息,而不是将它们直接传递给Validator
.为此,请将消息添加到lang/xx/validation.php
插件的语言文件。
return [
'required' => 'We need to know your e-mail address!',
'email.required' => 'We need to know your e-mail address!',
];
然后在你的电话中Validator::make
使用Lang:get
使用您的自定义文件。
Validator::make($formValues, $validations, Lang::get('acme.blog::validation'));
自定义验证规则
注册自定义验证规则
有多种有用的验证规则;但是,您可能希望指定一些您自己的。
注册自定义验证规则的最简单方法是添加registerValidationRules() : array
中的方法Plugin.php
注册文件 为您的插件。此方法应返回一个数组,其中键是验证器规则名称,值是扩展的类Winter\Storm\Validation\Rule
或可调用函数。可调用函数接收四个参数,$attribute
被验证,该$value
的属性和数组$parameters
传递给规则,并且$validator
实例。
public function registerValidationRules()
{
return [
'be_like_bob' => \Winter\Tester\Rules\BeLikeBobRule::class,
'uppercase' => function ($attribute, $value, $parameters, $validator) {
return strtoupper($value) === $value;
},
];
}
注册自定义验证规则的另一种方法是通过扩展 Validator 实例extend
方法。在 Winter CMS 插件中,这可以添加到boot()
你里面的回调方法Plugin.php
注册文件。
您可以使用自定义验证规则扩展 Validator 实例作为Closure
, 或者作为Rule
目的。
使用闭包
如果您只需要在整个插件或应用程序中指定一次自定义规则的功能,您可以使用闭包来定义规则。第一个参数定义规则的名称,第二个参数提供闭包。
use Validator;
public function boot()
{
Validator::extend('foo', function($attribute, $value, $parameters) {
return $value == 'foo';
});
}
自定义验证器 Closure 接收三个参数:$attribute
被验证,该$value
的属性,以及一个数组$parameters
传递给规则。
您还可以将类和方法传递给extend
方法而不是闭包:
Validator::extend('foo', 'FooValidator@validate');
使用自定义规则扩展验证器后,您需要将其添加到规则定义中。例如,您可以将其添加到$rules
你的模型数组。
public $rules = [
'field' => 'foo'
];
使用规则对象
ARule
object 代表您的模型的单个可重用验证规则Illuminate\Contracts\Validation\Rule
合同。每个规则对象必须提供三个方法:passes
确定给定值是否通过验证的方法和message
定义默认回退错误消息的方法。Rule
对象应该扩展Winter\Storm\Validation\Rule
抽象的。
<?php
use Winter\Storm\Validation\Rule;
class Uppercase extends Rule
{
/**
* Determine if the validation rule passes.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return strtoupper($value) === $value;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The :attribute must be uppercase.';
}
}
要使用您的规则对象扩展验证器,您可以向验证器提供该类的实例extend
方法:
Validator::extend('uppercase', Uppercase::class);
Rule
对象应该存储在/rules 插件目录中的子目录。
定义错误信息
您还需要为自定义规则定义一条错误消息。
和Rule
对象,您可以通过提供一个message
返回字符串的方法。该字符串可以是语言字符串,这将允许根据需要翻译消息。
创建自定义验证规则时,您有时可能需要为错误消息定义自定义占位符替换。您可以致电replacer
Validator facade 上的方法。您也可以在boot
你的插件的方法。
public function boot()
{
Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) {
// return a message as a string
});
}
回调接收 4 个参数:$message
作为验证器返回的消息,$attribute
作为验证失败的属性,$rule
作为规则对象和$parameters
是用验证规则定义的参数。例如,您可以将列名称注入到参数中定义的消息中:
public function boot()
{
Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) {
return str_replace(':column', $parameters[0], $message);
});
}
注册自定义验证器解析器
如果您希望为您的应用程序提供大量自定义规则,您还可以定义一个验证器解析器。请注意,每个 Validation 实例只能定义一个解析器,因此不建议在插件中定义解析器,除非您使用自己的 Validation 实例而不是全局 Validator facade。
要定义解析器,您可以向resolver
Validator 外观中的方法。
Validator::resolver(function($translator, $data, $rules, $messages, $customAttributes) {
return new CustomValidator($translator, $data, $rules, $messages, $customAttributes);
});
解析器中支持的每个规则都使用validateXXX
方法。例如,foo
验证规则会寻找一个名为validateFoo
.这validate
方法应该返回一个布尔值是否给定$value
通过验证。
public function validateFoo($attribute, $value, $parameters)
{
// return whether the value passes validation
}
与验证器一样replacer
方法,您有时可能需要为错误消息定义自定义占位符替换。您可以在解析器中通过定义一个replaceXXX
方法。
protected function replaceFoo($message, $attribute, $rule, $parameters)
{
return str_replace(':foo', $parameters[0], $message);
}