今天用 Laravel 写项目接口时,在使用字段必需(required)的验证规则时迷糊了一下,耽误了一点时间。看来有必要再次温习并总结记录下来,免得之后使用时再犯迷糊。
友情提示:因为项目原因,以下总结的验证规则基于 Laravel 9,使用不同的版本可能会存在一些出入。
required
required 是最简单,也是我最常用的必需验证规则。以控制器中的 Request 对象举例,比如要求请求数据中 name 字段必须要有,就可以这样来定义:
$request->validate([
'name' => 'required',
]);
required_if
required_if 是一个条件必填规则。用来定义当另外一个字段满足指定条件时才会触发当前字段的必需验证。比如 reason 字段默认不是必填项,但当 status_code 字段的值为 CANCELED 时,reason 就必需提供内容,就可以使用到 required_if 规则:
$request->validate([
'status_code' => 'required',
'reason' => 'required_if:status_code,CANCELED',
]);
required_unless
required_unless 和 required_if 的用法相反,用来定义当另外一个字段不等于指定值时才使用必需验证。还是用上面的例子,比如想要 status_code 不等于 PENDING 时,reason 就必须要提供内容:
$request->validate([
'status_code' => 'required',
'reason' => 'required_unless:status_code,PENDING',
]);
required_with
required_with 的验证方式是当指定的另外一个字段不为空时触发当前字段的必需验证规则。一个典型的使用场景是输入两次密码确认:
$request->validate([
'password_repeat' => 'required_with:password',
]);
请求数据中不提供 password 字段和内容就不会出发 password_repeat 的必需验证规则。和上面几个验证规则不同,required_with 冒号后面使用逗号分隔多个字段名称,而不是名称和值。多个名称中只要有一个有提供内容,都会触发验证规则。
required_with_all
required_with_all 是 required_with 的进阶版,只有定义在冒号后的所有字段都有内容时,才会触发必需验证规则。
$request->validate([
'password' => 'required_with_all:phone,email',
]);
上面这个定义只有 phone 和 email 字段都有内容时才会触发 password 的必需验证。
required_without
required_without 是 required_with 的反向定义,当定义在规则后的字段没有提供时会触发。这也是我今天需要用的验证规则。我的场景是验证 price 和 quantity 这两个字段,在请求时必需要提供任意一个。使用 required_without 规则的写法如下:
$request->validate([
'quantity' => 'required_without:price',
'price' => 'required_without:quantity',
]);
这样只有在两个字段都不提供时才会触发必需验证,提供任意一个字段都可以通过验证。
required_without_all
跟 required_with_all 一样的用法,只不过是反向定义。用来定义多个字段都没有提供时才触发验证。
required_array_keys
required_array_keys 是一个比较高级的必需验证规则,对于指定的字段,它会使用两条验证规则:
- 必须是数组。
- 必须包含指定的数组键名。
以验证一个 product 产品字段为例,必须是数组格式,并且要提供 id, name 和 price,规则的定义如下:
$request->validate([
'product' => 'required_array_keys:id,name,price',
]);
需要注意的是,required_array_keys 不会在主字段上使用必需规则。比如上面的规则如果在请求时不提供 product 字段,也可以通过验证,所以需要搭配 required 规则使用。