Laravel 验证规则
目录
自带的验证规则
以下是所有可用的验证规则及其功能的列表
accepted
验证中的字段必须为yes,on,1或true。这对于验证是否接受“服务条款”这种场景很有用。
active_url
根据PHP函数dns_get_record
函数,验证中的字段必须具有有效的A或AAAA记录。URL的主机名在传递个dns_get_record函数之前需要先有parse_url函数进行提取。
after:date
验证下的字段必须是给定日期之后的值。日期将被传递到strtotimePHP函数中:
'start_date' => 'required|date|after:tomorrow'
可以指定另一个字段与日期进行比较,而不用传递一个date字符串个给strtotime
函数串:
'finish_date' => 'required|date|after:start_date'
after_or_equal:date
验证中的字段必须是晚于或等于给定日期的值
alpha
验证中的字段必须完全是字母字符。
alpha_dash
验证中的字段可能包含字母数字字符以及破折号和下划线。
alpha_num
验证中的字段必须完全是字母数字字符。
array
验证中的字段必须为PHP array。
bail
第一次验证失败后,停止运行验证规则。
before:date
验证中的字段必须是给定日期之前的值。
before_or_equal:date
验证中的字段必须是早于或等于给定日期的值。
between:min,max
验证中的字段的大小必须介于给定的min和max之间。
boolean
验证中的字段必须能够转换为布尔值。
confirmed
验证中的字段必须具有一个对其进行确认的字段foo_confirmation
。例如,如果正在验证的字段为password,password_confirmation则输入中必须存在匹配的字段。
date
验证中的字段必须为有效的日期。
date_equals:date
验证中的字段必须等于给定的日期。
date_format:format
验证中的字段必须匹配给定的格式。
different:field
验证中的字段必须具有不同于field的值。
digits:value
验证中的字段必须为数字,并且必须具有精确的value长度。
digits_between:min,max
验证中的字段必须为数字,并且长度必须介于给定的min和max之间。
dimensions
验证中的文件必须是满足规则参数指定的尺寸限制的图像:
'avatar' => 'dimensions:min_width=100,min_height=200'
可用的约束为:minwidth,maxwidth,minheight,maxheight,width,height,ratio。
ratio 的值是用宽度除以高度得来的。可以通过类似与3/2,或者float数值(如1.5)来指定:
'avatar' => 'dimensions:ratio=3/2'
由于此规则需要几个参数,因此我们可以使用Rule::dimensions
方法来构建规则:
use Illuminate\Validation\Rule;
Validator::make($data, [
'avatar' => [
'required',
Rule::dimensions()->maxWidth(1000)->maxHeight(500)->ratio(3 / 2),
],
]);
distinct
使用数组时,验证下的字段不得包含任何重复的值。
'foo.*.id' => 'distinct'
验证下的字段必须格式化为电子邮件地址。在后台,此验证规则利用egulias/email-validator
来验证电子邮件地址。默认使用RFCValidation
验证器,但也可以应用其他验证样式:
'email' => 'email:rfc,dns'
上面的示例将应用RFCValidation
和DNSCheckValidation
验证。下面是可以应用的验证样式的完整列表:
rfc: RFCValidation
strict: NoRFCWarningsValidation
dns: DNSCheckValidation
spoof: SpoofCheckValidation
filter: FilterEmailValidation
endswith:foo,bar,...
验证中的字段必须以给定值之一结尾。
exclude_if:anotherfield,value
如果anotherfield字段等于value,则正在验证的字段将从validate
和validated
方法返回的请求数据中排除。
exclude_unless:anotherfield,value
除非anotherfield的字段等于value,否则正在验证的字段将从validate和validated方法返回的请求数据中排除。
exists:table,column
验证的字段必须存在于给定的数据库表上。
'state' => 'exists:states'
如果column未指定该选项,则将使用字段名称。
'state' => 'exists:states,abbreviation'
有时,我们可能需要指定用于exists查询的特定数据库连接。可以通过使用“ .”语法在连接名之前添加表名来完成此操作:
'email' => 'exists:connection.staff,email'
可以指定用来确定表名的Eloquent模型,而不是直接指定表名:
'user_id' => 'exists:App\User,id'
如果要定制验证规则执行的查询,则可以使用Rule类来流畅地定义规则。在此示例中,我们还将验证规则指定为数组,而不是使用|
字符来分隔它们:
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::exists('staff')->where(function ($query) {
$query->where('account_id', 1);
}),
],
]);
file
验证下的字段必须是成功上传的文件。
filled
验证中的字段存在时,不能为空。
gt:field
验证中的字段必须大于给定的字段。这两个字段必须具有相同的类型。字符串,数字,数组和文件使用与size规则相同的约定进行验证。
gte:field
验证中的字段必须大于或等于给定的字段。这两个字段必须具有相同的类型。字符串,数字,数组和文件使用与size规则相同的进行验证。
image
验证中的文件必须是图像(jpeg,png,bmp,gif,svg或webp)
in:foo,bar,...
验证下的字段必须包含在给定的值列表中。由于此规则通常需要将数组进行指定分隔符连接,因此可以使用Rule::in
方法来流畅地构建规则:
use Illuminate\Validation\Rule;
Validator::make($data, [
'zones' => [
'required',
Rule::in(['first-zone', 'second-zone']),
],
]);
in_array:anotherfield.*
验证中的字段必须存在于anotherfield的值中。
integer
验证中的字段必须为整数。
ip
验证下的字段必须是IP地址。
ipv4
验证中的字段必须是IPv4地址。
ipv6
验证中的字段必须是IPv6地址。
json
验证中的字段必须是有效的JSON字符串。
lt:field
验证中的字段必须小于给定的字段。这两个字段必须具有相同的类型。
lte:field
验证中的字段必须小于或等于给定的字段。这两个字段必须具有相同的类型。
max:value
待验证的字段必须小于或等于指定的value。
mimetypes:text/plain,...
验证中的文件必须与给定的MIME类型之一匹配:
'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime'
mimes:foo,bar,...
验证中的文件必须具有与列出的扩展名之一相对应的MIME类型。
'photo' => 'mimes:jpeg,bmp,png'
min:value
待验证的字段不能小于指定的value值。
not_in:foo,bar,...
验证中的字段不得包含在给定的值列表中。可以使用 Rule::notIn
方法
use Illuminate\Validation\Rule;
Validator::make($data, [
'toppings' => [
'required',
Rule::notIn(['sprinkles', 'cherries']),
],
]);
not_regex:pattern
验证中的字段不得与给定的正则表达式匹配。
nullable
验证中的字段可能是null。
numeric
验证下的字段必须为数字。
password
验证下的字段必须与经过身份验证的用户密码匹配。
'password' => 'password:api'
present
验证中的字段必须存在于输入数据中,但可以为空。
regex:pattern
验证中的字段必须匹配给定的正则表达式。
required
验证中的字段必须存在于输入数据中,并且不能为空。如果满足以下条件之一,则该字段被视为“空”:
- 值是null。
- 该值是一个空字符串。
- 该值是一个空数组或空Countable对象。
- 该值是没有路径的上载文件。
required_if:anotherfield,value,...
如果anotherfield字段等于指定的任意value,则正在验证的字段必须存在且不能为空。
如果想为required_if规则构造一个更复杂的条件,则可以使用Rule::requiredIf
方法。
use Illuminate\Validation\Rule;
Validator::make($request->all(), [
'role_id' => Rule::requiredIf($request->user()->is_admin),
]);
Validator::make($request->all(), [
'role_id' => Rule::requiredIf(function () use ($request) {
return $request->user()->is_admin;
}),
]);
required_unless:anotherfield,value,...
除非anotherfield字段等于 指定的任意value,否则正在验证的字段必须存在且不能为空。
required_with:foo,bar,...
仅当存在任何其他指定的字段时,验证下的字段必须存在且不为空。
required_with_all:foo,bar,...
仅当所有其他指定的字段都存在时,验证中的字段必须存在且不为空。
required_without:foo,bar,...
仅当不存在任何其他指定字段时,验证下的字段必须存在且不为空。
required_without_all:foo,bar,...
仅当所有其他指定的字段都不存在时,验证中的字段必须存在且不为空。
same:field
给定的字段必须与正在验证的字段匹配。
size:value
验证中的字段必须具有与给定值匹配的大小。对于字符串,则value是字符串中的字符个数;对于数字,则value是值的大小;对于数组,value则是元素的个数。
// Validate that a string is exactly 12 characters long...
'title' => 'size:12';
// Validate that a provided integer equals 10...
'seats' => 'integer|size:10';
// Validate that an array has exactly 5 elements...
'tags' => 'array|size:5';
// Validate that an uploaded file is exactly 512 kilobytes...
'image' => 'file|size:512';
starts_with:foo,bar,...
验证中的字段必须以给定值之一开头。
string
验证中的字段必须为字符串。
timezone
验证中的字段必须是有效的时区标识符。
unique:table,column,except,idColumn
验证中的字段在给定的数据库表中一定不能存在。
可以指定用来确定表名的Eloquent模型,而不是直接指定表名:
'email' => 'unique:App\User,email_address'
column选项可用于指定字段的对应数据库列。如果column未指定该选项,则将使用字段名称。
'email' => 'unique:users,email_address'
有时,我们可能需要为Validator进行的数据库查询设置自定义连接。
'email' => 'unique:connection.users,email_address'
url
验证下的字段必须是有效的URL。
uuid
验证中的字段必须是有效的RFC 4122(版本1、3、4或5)通用唯一标识符(UUID)。
自定义验证规则
使用规则对象
Laravel提供了多种有用的验证规则;但是,我们可能希望自己指定一些规则。注册自定义验证规则的一种方法是使用规则对象。要生成新的规则对象,可以使用Artisan命令make:rule
。让我们使用此命令来生成一个验证字符串是否为大写的规则。Laravel会将新规则放置在app/Rules
目录中:
$ php artisan make:rule Uppercase
创建规则后,我们就可以定义其行为了。规则对象包含两个方法:passes
和message
。passes
方法接收属性值和名称,并根据属性值是否有效来返回true或false。message
方法返回验证失败时应使用的验证错误消息:
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Uppercase implements 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.';
}
}
如果我们想从translation 文件中返回错误消息,则可以从message
方法中调用trans
帮助函数:
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return trans('validation.uppercase');
}
定义规则后,您可以通过将规则对象的实例与其他验证规则一起传递给验证器:
use App\Rules\Uppercase;
$request->validate([
'name' => ['required', 'string', new Uppercase],
]);
使用闭包
如果在整个应用程序中只需要一次自定义规则的功能,则可以使用闭包代替规则对象。Closure
接收属性的名称,属性的值,以及在验证失败时应调用的回调$fail
:
$validator = Validator::make($request->all(), [
'title' => [
'required',
'max:255',
function ($attribute, $value, $fail) {
if ($value === 'foo') {
$fail($attribute.' is invalid.');
}
},
],
]);
使用扩展
注册自定义验证规则的另一种方法是使用Validator Facade
的extend
方法。让我们在Service Provider
中使用此方法来注册自定义验证规则:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Validator::extend('foo', function ($attribute, $value, $parameters, $validator) {
return $value == 'foo';
});
}
}
定制验证程序Closure接收四个参数:
- $attribute:被验证的名称
- $value:属性的名称,
- $parameters传递给规则的数组
- Validator实例
我们也可以将类和方法传递给extend方法:
Validator::extend('foo', 'FooValidator@validate');
定义错误信息
我们还需要为自定义规则定义错误消息。可以使用嵌入式自定义消息数组,也可以通过在验证语言文件中添加条目来实现。该消息应放置在数组的第一级中,而不是放置在custom数组中,这仅用于特定属性的错误消息:
"foo" => "Your input was invalid!",
"accepted" => "The :attribute must be accepted.",
// The rest of the validation error messages...
创建自定义验证规则时,有时可能需要为错误消息定义自定义占位符。我们可以通过如上所述创建的自定义验证程序,然后通过调用Validator Facade
的replacer
方法来实现。我们可以在Service Provider
的boot
方法中执行此操作:
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Validator::extend(...);
Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) {
return str_replace(...);
});
}
隐式扩展
默认情况下,当不存在正在验证的属性或包含空字符串时,将不运行包括定制扩展名在内的常规验证规则。例如,unique
规则将不会针对空字符串进行验证:
$rules = ['name' => 'unique:users,name'];
$input = ['name' => ''];
Validator::make($input, $rules)->passes(); // true
为了即使属性为空也要运行规则,规则必须设置该属性是必需的。要创建这样的“隐式”扩展名,使用Validator::extendImplicit()
方法:
Validator::extendImplicit('foo', function ($attribute, $value, $parameters, $validator) {
return $value == 'foo';
});
“隐式”扩展名仅表示该属性是必需的。它是否实际上使缺少的属性或空的属性无效取决于我们的判断。
隐式规则对象
如果希望在属性为空时运行规则对象,则应实现Illuminate\Contracts\Validation\ImplicitRule
接口。该接口用作验证程序的“标记接口”。因此,它不包含您需要实现的任何方法。