可用的验证规则
下方列出了所有可用的验证规则及其功能:
accepted
待验证字段必须是 "yes"
,"on"
,1
或 true
。这对于验证「服务条款」的接受或类似字段时很有用。
accepted_if:anotherfield,value,...
如果另一个正在验证的字段等于指定的值,则验证中的字段必须为 "yes"
,"on"
,1
或 true
,这对于验证「服务条款」接受或类似字段很有用。
active_url
根据 dns_get_record
PHP 函数,验证中的字段必须具有有效的 A 或 AAAA 记录。 提供的 URL 的主机名使用 parse_url
PHP 函数提取,然后传递给 dns_get_record
。
after:date
待验证字段必须是给定的日期之后的值对应的日期。日期将被传递给 PHP 函数 strtotime
,以便转换为有效的 DateTime
实例:
'start_date' => 'required|date|after:tomorrow'
你亦可指定另一个要与日期比较的字段,而不是传递要由 strtotime
处理的日期字符串:
'finish_date' => 'required|date|after:start_date'
after_or_equal:date
待验证字段的值对应的日期必须在给定日期之后或与给定的日期相同。可参阅 after 规则获取更多信息。
alpha
待验证字段只能由英文字母组成。
Validate::make(rules: [
'city' => 'alpha'
])->check(data: [
'city' => 'Beijing'
]);
如果想验证所有的Unicode字母字符,可添加 `all`选项。
Validate::make(rules: [
'city' => 'alpha:all'
])->check(data: [
'city' => '北京'
]);
alpha_dash
待验证字段可能包含英文字母、数字、短破折号(-)和下划线(_)。
Validate::make(rules: [
'city' => 'alpha_dash'
])->check(data: [
'city' => 'shang-hai'
]);
如果想验证所有的Unicode字母字符,可添加 `all`选项。
Validate::make(rules: [
'city' => 'alpha_dash:all'
])->check(data: [
'city' => '中国-上海'
]);
alpha_num
待验证字段只能由英文字母和数字组成。
Validate::make(rules: [
'city' => 'alpha_num'
])->check(data: [
'city' => 'China1949'
]);
如果想验证所有的Unicode字母字符,可添加 `all`选项。
Validate::make(rules: [
'city' => 'alpha_num:all'
])->check(data: [
'city' => '中国1949'
]);
array
待验证字段必须是有效的 PHP 数组
。
如果想验证数组必须为数字为索引的数组,可使用@list
参数
'ids' => 'array:@list'
当向 array
规则提供附加值时,输入数组中的每个键都必须出现在提供给规则的值列表中。在以下示例中,输入数组中的 admin
键无效,因为它不包含在提供给 array
规则的值列表中:
use Itwmw\Validate\Validate;
$input = [
'user' => [
'name' => 'Taylor Otwell',
'username' => 'taylorotwell',
'admin' => true,
],
];
Validate::make( [
'user' => 'array:username,locale',
])->check($input);
通常,你应该始终指定允许在数组中出现的数组键。否则,验证器的 check
方法将返回所有已验证的数据,包括数组及其所有键,即使这些键没有通过其他嵌套的数组验证规则进行验证。
如果某些键是可选的,可使用中括号括起来
'user' => 'array:username,locale,[admin]'
在上述规则中,username
,locale
必填,admin
可选
注意
当存在@list
时,不可以使用其他参数
before:date
待验证字段的值对应的日期必须在给定的日期之前。日期将会传递给 PHP 函数 strtotime
。此外,与 after
规则一致,可以将另外一个待验证的字段作为 date
的值。
before_or_equal:date
验证字段必须是在给定日期之前或与之相同的日期。这个日期值将会被传递给 PHP 的 strtotime
函数来计算。除此之外,像 after
规则一样,验证中另一个字段的名称可以作为值传递给 date
。
between:min,max
验证字段的大小必须在给定的 min 和 max 之间。字符串、数字、数组和文件的计算方式都使用 size
方法。
boolean
验证的字段必须可以转换为 Boolean 类型。 可接受的输入为 true
, false
, 1
, 0
, "1"
和 "0"
。
chs
待验证字段只能由中文组成。
chs_alpha
待验证字段只能由中文和字母组成。
chs_dash
待验证字段可能包含中文、英文字母、数字、短破折号(-)和下划线(_)。
chs_alpha_num
待验证字段可能包含中文、字母和数字。
confirmed
验证字段必须具有匹配字段 {field}_confirmation
。例如,验证字段为 password
,输入中必须存在与之匹配的 password_confirmation
字段。
contains:foo,bar,…
这个验证字段必须是一个数组,其中包含了所有给定的参数数值。
提示
如果你需要对每个数组成员指定是否可选,可以使用 Array 规则
date
根据 PHP strtotime
函数,验证的字段必须是有效的日期。
date_equals:date
验证字段必须等于给定日期。日期将传递到 PHP strtotime
函数中,以便转换为有效的 DateTime
实例。
date_format:format
验证字段必须匹配给定的 format(日期格式)。当验证某个字段的时候,你应该只使用 date
或者 date_format
,而不是同时使用。此验证规则支持 PHP 所有的 DateTime 类。
decimal:min,max
被验证的字段必须是数字,并且必须包含指定的小数位数。
// 必须正好有两位小数(9.99)...
'price' => 'decimal:2'
// 必须有2到4位小数...
'price' => 'decimal:2,4'
declined
被验证的字段必须是 "no"
, "off"
, 0
, 或 false
.
declined_if:anotherfield,value,...
如果指定的字段等于一个指定的值,那么当前字段必须是"no"
, "off"
, 0
, 或 false
.
different:field
验证的字段值必须与字段 field 的值不同。
digits:value
验证的字段必须为 numeric,并且必须具有确切长度 value。
digits_between:min,max
验证的字段必须为 numeric,并且长度必须在给定的 min 和 max 之间。
dimensions
验证的文件必须是图片并且图片比例必须符合规则:
'avatar' => 'dimensions:min_width=100,min_height=200'
可用的规则为: min_width,max_width,min_height,max_height,width,height,ratio。
ratio 约束应该表示为宽度除以高度。 这可以通过像 3/2
这样的语句或像 1.5
这样的 float
来指定:
'avatar' => 'dimensions:ratio=3/2'
distinct
验证数组时,指定的字段不能有任何重复值。
'foo.*.id' => 'distinct'
默认情况下,Distinct 使用松散的变量比较。要使用严格比较,您可以在验证规则定义中添加 strict 参数:
'foo.*.id' => 'distinct:strict'
你可以在验证规则的参数中添加 ignore_case
,以使规则忽略大小写差异:
'foo.*.id' => 'distinct:ignore_case'
doesnt_start_with:foo,bar,...
验证的字段不能以给定的任意值开始。
doesnt_end_with:foo,bar,...
验证的字段不能以给定的任意值结束。
验证字段是否为email
格式
'email' => 'email'
enum
验证的字段必须是枚举类型。
ends_with:foo,bar,...
验证的字段必须以给定的值之一结尾。
exclude
check
方法中将会排除掉当前验证的字段。
exclude_if:anotherfield,value
如果 anotherfield 等于 value ,check
方法中会排除掉当前的字段。
exclude_unless:anotherfield,value
除非 anotherfield 等于 value ,否则 check
方法中会排除掉当前的字段。
exclude_with:anotherfield
如果表单中存在 anotherfield,那么check
方法中将会排除掉当前验证的字段。
exclude_without:anotherfield
如果 anotherfield 不在表单数据中,check
方法中会排除掉当前的字段。
exists:table,column
验证的字段必须存在于给定的数据库表中。
Exists 规则的基本用法
'state' => 'exists:states'
如果未指定 column
选项,则将使用字段名称。因此,在这种情况下,该规则将验证 states
数据库表是否包含一条记录,该记录的 states
列的值与请求的 states
属性值匹配。
指定自定义列名
你可以将验证规则使用的数据库列名称指定在数据库表名称之后:
'state' => 'exists:states,abbreviation'
如果你需要指定 exists
方法用来查询的数据库。你可以通过使用「点」语法将数据库的名称添加到数据表前面来实现这个目的:
'email' => 'exists:connection.staff,email'
如果需要增加额外的条件。您可以在第三个参数开始写入你的条件:
'email' => 'exists:connection.staff,email,account_id,1'
条件可多个,但必须成对出现
如果想引入其他的验证数据中的值,可使用
[field]
来表示
自定义操作符
默认情况下,字段和值之间的关系是 =
,如果想修改关系,可以在字段后面跟随操作符,如:account_id@<>,1
, 会生成where account_id <> 1
的 SQL 语句
extensions:foo,bar,...
验证的文件必须具有与列出的扩展名之一对应的用户分配的扩展名:
'photo' => ['required', 'extensions:jpg,png'],
file
验证的字段必须是成功上传的文件。
filled
验证的字段在存在时不能为空。
gt:field
验证字段必须大于给定的 field。两个字段必须是相同的类型。字符串、数字、数组和文件都使用 size
进行相同的评估。
gte:field
验证字段必须大于或等于给定的 field 。两个字段必须是相同的类型。字符串、数字、数组和文件都使用 size
进行相同的评估。
id_card
被验证的字段必须是合法的中国居民身份证格式。
image
验证的文件必须是图片(jpg,jpeg,png,bmp,gif,svg,或 webp)。
in:foo,bar,...
验证字段必须包含在给定的值列表中。
Validate::make([
'type' => 'required|in:save,update,delete'
])->check($data);
in_array:anotherfield.*
验证的字段必须存在于 anotherfield 的值中。
in_enum:enum_class,type,strict
验证的字段必须存在于 enum_class 中
'type' => 'in_enum:Types,strict',
'user_type' => 'in_enum:UserTypes,value',
'login_type' => 'in_enum:LoginTypes,name,strict',
type
可以指定为 name
或 value
name
通过枚举类的名称进行验证value
通过枚举类的值进行验证
如果未指定将判断验证的字段是否存在于 enum_class 中,如不存在,则验证 name
或者 value
是否属于此枚举类
如指定
type
为name
,并且指定了strict
,则根据枚举类名称来验证时,区分大小写,否则不区分
integer
验证的字段必须是整数。
注意:此种验证规则不是验证数据是 「integer」 类型,仅验证输入为 PHP 函数
FILTER_VALIDATE_INT
规则接受的类型。如果你需要验证输入为数字,请将此规则与numeric
验证规则 结合使用。
ip
验证的字段必须是 IP 地址。
ipv4
验证的字段必须是 IPv4 地址。
ipv6
验证的字段必须是 IPv6 地址。
mac_address
验证的字段必须是 Mac 地址。
mobile
验证的字段必须是合法的中国手机号码。
json
验证的字段必须是有效的 JSON 字符串。
lt:field
验证的字段必须小于给定的字段。这两个字段必须是相同的类型。字符串、数值、数组和文件大小的计算方式与 size
方法进行评估。
lte:field
验证中的字段必须小于或等于给定的 字段 。这两个字段必须是相同的类型。字符串、数值、数组和文件大小的计算方式与 size
方法进行评估。
lowercase
被验证的字段必须是小写。
max:value
验证中的字段必须小于或等于 value。字符串、数字、数组或是文件大小的计算方式都用 size
规则。
max_digits:value
被验证的字段必须为数值且长度不可大于value。
mimetypes:text/plain,...
验证的文件必须具备与列出的其中一个扩展相匹配的 MIME 类型:
'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime'
为了确定上传文件的 MIME,框架将会读取文件,然后自动推测文件 MIME 类型,这可能与客户端提供的 MIME 类型不一致。
mimes:foo,bar,...
验证的文件必须具有与列出的其中一个扩展名相对应的 MIME 类型。
MIME 规则基本用法
'photo' => 'mimes:jpg,bmp,png'
即使你可能只需要验证指定扩展名,但此规则实际上会去验证文件的 MIME 类型,其通过读取文件内容来推测它的 MIME 类型。
可以在以下链接中找到完整的 MIME 类型列表及相对应的扩展名:
https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
min:value
验证字段必须具有最小值 value。 字符串,数值,数组,文件大小的计算方式都与 size
规则一致.
min_digits:value
被验证的字段必须为数值且长度不能小于value。
multiple_of:value
验证字段必须是 value 的倍数。
missing
验证字段不能出现在正在验证的数据中。
missing_if:anotherfield,value,...
如果 anotherfield 字段等于 value,则正在验证的字段必须不存在。
missing_unless:anotherfield,value
如果 anotherfield 字段不等于 value,则正在验证的字段必须不存在。
missing_with:foo,bar,...
只有当其他指定的字段存在时,验证中的字段才必须不存在。
missing_with_all:foo,bar,...
只有当所有其他指定的字段都存在时,验证中的字段才必须不存在。
not_exists:table,column
验证的字段必须不存在于给定的数据库表中。与规则 Exists 相反。
not_in:foo,bar,...
验证字段不能包含在给定的值的列表中。
Validate::make([
'type' => 'required|notIn:save,update,delete'
])->check($data);
not_regex:pattern
验证字段必须与给定的正则表达式不匹配。
验证时,这个规则使用 PHP preg_match
函数。指定的模式应遵循 preg_match
所需的相同格式,也包括有效的分隔符。 例如: 'email' => 'not_regex:/^.+$/i'
。
正则中包含`|`
可以使用数组来指定规则,或者在验证器中使用regex属性来指定正则表达式规则
nullable
验证字段可以为 null
。
numeric
验证字段必须为 数值。
present
在验证时,字段必须存在于输入数据中。
present_if:anotherfield,value,…
当 anotherfield 字段等于任何 value 时,在验证时,该字段必须存在。
present_unless:anotherfield,value
除非 anotherfield 字段等于任何 value,在验证时,该字段必须存在。
present_with:foo,bar,…
只有在 任何其他指定字段存在且不为空时,在验证时,该字段必须存在且不为空。
present_with_all:foo,bar,…
只有在 所有其他指定字段都存在且不为空时,在验证时,该字段必须存在且不为空。
prohibited
在验证时,该字段必须缺失或空。字段为「空」的情况如下:
- 值为
null
。 - 值为空字符串。
- 值为空数组或空的
Countable
对象。 - 值为路径为空的上传文件。
prohibited_if:anotherfield,value,...
如果 anotherfield 字段等于任何值,则验证中的字段必须为空或不存在。
prohibited_unless:anotherfield,value,...
验证中的字段必须为空或不存在,除非 anotherfield 字段等于 value 。
prohibits:anotherfield,...
如果验证中的字段存在,则 anotherfield 中不能存在任何字段,即使该字段为空。
regex:pattern
验证字段必须与给定的正则表达式匹配。
验证时,这个规则使用 PHP 的 preg_match
函数。 指定的模式应遵循 preg_match
所需的相同格式,也包括有效的分隔符。 例如: 'email' => 'not_regex:/^.+$/i'
。
正则中包含`|`
可以使用数组来指定规则,或者在验证器中使用regex属性来指定正则表达式规则
required
验证的字段必须存在于输入数据中,而不是空。如果满足以下条件之一,则字段被视为「空」:
- 值为
null
。 - 值为空字符串。
- 值为空数组或空
Countable
对象。 - 值为无路径的上传文件。
required_if:anotherfield,value,...
如果其它字段 _anotherfield_
为任意 value,则此验证字段必须存在且不为空。
required_if_accepted:anotherfield
如果 anotherfield 字段等于 「yes」
, 「on」
, 1
, 「1」
, true
, 或 「true」
,在验证时,该字段必须存在且不为空。
required_if_declined:anotherfield,…
如果 anotherfield 字段等于 「no」
, 「off」
, 0
, 「0」
, false
, 或 「false」
,在验证时,该字段必须存在且不为空。
required_unless:anotherfield,value,...
如果其它字段 anotherfield 不等于任意值 value ,则此验证字段必须存在且不为空。
required_with:foo,bar,...
在其他任一指定字段出现时,验证的字段才必须存在且不为空。
required_with_all:foo,bar,...
只有在其他指定字段全部出现时,验证的字段才必须存在且不为空。
required_without:foo,bar,...
在其他指定任一字段不出现时,验证的字段才必须存在且不为空。
required_without_all:foo,bar,...
只有在其他指定字段全部不出现时,验证的字段才必须存在且不为空。
required_array_keys:foo,bar,...
被验证的字段必须是一个数组,并且必须包含指定的键。
same:field
验证字段的值必须与给定字段的值相同。
size:value
验证字段必须与给定的 value 大小一致。对于字符串,value 对应字符数。对于数字,value 对应给定的整数值(该属性必须有 numeric
或者 integer
规则)。 对于数组,size 对应数组的 count
值。对于文件,size 对应文件大小(单位 kB)。 让我们来看几个例子:
// 验证字符串长度是否为 12...
'title' => 'size:12';
// 验证数字是否为 10...
'seats' => 'integer|size:10';
// 验证数组的长度(拥有的元素)是否为 5...
'tags' => 'array|size:5';
// 验证上传的文件是否为 512 kB...
'image' => 'file|size:512';
size
规则同样也支持其他字段,需要对比判断时,直接写入其他字段名称即可
Validate::make( [
'title' => 'string|size:length'
])->check([
'length' => 2,
'title' => '标题'
]);
Validate::make( [
'ids' => 'array|size:length'
])->check([
'length' => 3,
'ids' => [1,2,3]
]);
starts_with:foo,bar,...
验证字段必须以给定值之一开头。
string
验证字段必须是一个字符串。如果允许这个字段为 null
,需要给这个字段分配 nullable
规则。
timezone
验证字段必须为符合 PHP 函数 timezone_identifiers_list
所定义的有效时区标识。
unique:table,column,idColumn,except
验证字段在给定的数据库表中必须是唯一的。
指定自定义数据表 / 列名:
column
选项可用于指定相应数据库列的字段。如果未指定 column
选项,则使用字段本身名称。
'email' => 'unique:users,email_address'
自定义数据库连接
有时,你可能需要为验证器创建的数据库查询设置自定义连接。为此,你可以在连接名称之前添加表名称:
'email' => 'unique:connection.users,email_address'
增加额外的条件
如果需要增加额外的条件。您可以在_except_
后写入你的条件:
'email' => 'unique:connection.users,email_address,id,[id],account_id,1'
自定义操作符
默认情况下,字段和值之间的关系是 =
,如果想修改关系,可以在字段后面跟随操作符,如:account_id@<>,1
, 会生成where account_id <> 1
的 SQL 语句
url
验证的字段必须是有效的 URL。
uppercase
被验证的字段必须是大写。
uuid
验证字段必须是有效的 RFC 4122(版本 1,3,4 或 5)通用唯一标识符(UUID)。
按条件增加规则
字段包含特定值跳过验证
如果另一个字段具有给定的值,你可能偶尔希望不验证给定字段。你可以使用 exclude_if
验证规则来实现这一点。在本例中,如果 has_appointment
字段的值为 false
,则不会验证 appointment_date
和 doctor_name
字段:
use Itwmw\Validate\Validate;
$validator = Validate::make([
'has_appointment' => 'required|boolean',
'appointment_date' => 'exclude_if:has_appointment,false|required|date',
'doctor_name' => 'exclude_if:has_appointment,false|required|string',
])->check($data);
你可以使用 exclude_unless
规则来验证给定字段,除非另一个字段具有给定的值:
$validator = Validate::make([
'has_appointment' => 'required|boolean',
'appointment_date' => 'exclude_unless:has_appointment,true|required|date',
'doctor_name' => 'exclude_unless:has_appointment,true|required|string',
])->check($data);
存在时则验证
在某些情况下,你可能希望将要验证的字段存在于输入数组中时,才对该字段执行验证。可以在规则列表中增加 sometimes
来实现:
$v = Validate::make([
'email' => 'sometimes|required|email',
])->check($data);
在上面的例子中,email
字段只有在 $data
数组中存在时才会被验证。