语法

修改理由:
相关信息:
- 类型:文档文章
- 文章: 表单验证
- 文档: 《Laravel 9 中文文档(9.x)》
此投稿由 MArtian 在 2年前 合并。
标题修改:
内容修改:
Old | New | Differences |
---|---|---|
122 | 122 | } |
123 | 123 | |
124 | 124 | 如您所见,验证规则被传递到 `validate` 方法中。不用担心 - 所有可用的验证规则均已[记录在案](#available-validation-rules)。另外再提醒一次,如果验证失败,会自动生成一个对应的响应。如果验证通过,那我们的控制器会继续正常运行。 |
125 | 或者,验证规则可以使用数组而不是单个 | |
125 | 或者,验证规则可以使用数组而不是单个 `|` 分隔的字符串: | |
126 | 126 | |
127 | 127 | $validatedData = $request->validate([ |
128 | 128 | 'title' => ['required', 'unique:posts', 'max:255'], | … | … |
154 | 154 | <a name="a-note-on-nested-attributes"></a> |
155 | 155 | #### 嵌套字段的说明 |
156 | 156 | |
157 | 如果你的 HTTP 请求包含「嵌套」参数, | |
157 | 如果你的 HTTP 请求包含「嵌套」参数,你可以在验证规则中使用 `.` 语法来指定这些参数: | |
158 | 158 | |
159 | 159 | $request->validate([ |
160 | 160 | 'title' => 'required|unique:posts|max:255', | … | … |
162 | 162 | 'author.description' => 'required', |
163 | 163 | ]); |
164 | 164 | |
165 | 另外,如果你的字段名称包含点,则可以通过使用反斜杠将点转义,以防止将其解释为 | |
165 | 另外,如果你的字段名称包含点,则可以通过使用反斜杠将点转义,以防止将其解释为 `.` 语法: | |
166 | 166 | |
167 | 167 | $request->validate([ |
168 | 168 | 'title' => 'required|unique:posts|max:255', | … | … |
203 | 203 | |
204 | 204 | Laravel 的内置验证规则每个都有一条错误消息,位于应用程序的 `lang/en/validation.php` 文件中。在此文件中,你将找到每个验证规则的翻译条目。你可以根据应用程序的需求随意更改或修改这些消息。 |
205 | 205 | |
206 | 此外,你可以将此文件复制到另一个翻译语言的目录中,以翻译应用程序语言的消息。要了解有关 Laravel 本地化的更多信息,请查看完整的 [本地化文档](/docs/laravel/9.x/localization) | |
206 | 此外,你可以将此文件复制到另一个翻译语言的目录中,以翻译应用程序语言的消息。要了解有关 Laravel 本地化的更多信息,请查看完整的 [本地化文档](/docs/laravel/9.x/localization)。 | |
207 | 207 | |
208 | 208 | <a name="quick-xhr-requests-and-validation"></a> |
209 | 209 | #### XHR 请求 & 验证 |
210 | 210 | |
211 | 在如下示例中,我们使用传统形式将数据发送到应用程序。但是,许多应用程序从 JavaScript 驱动的前端接收 XHR 请求。在 XHR 请求期间使用 `validate` 方法时,Laravel 将不会生成重定向响应。相反,Laravel 会生成一个包含所有验证错误的 JSON 响应。该 JSON 响应将以 | |
211 | 在如下示例中,我们使用传统形式将数据发送到应用程序。但是,许多应用程序从 JavaScript 驱动的前端接收 XHR 请求。在 XHR 请求期间使用 `validate` 方法时,Laravel 将不会生成重定向响应。相反,Laravel 会生成一个包含所有验证错误的 JSON 响应。该 JSON 响应将以 `422` HTTP 状态码发送。 | |
212 | 212 | |
213 | 213 | <a name="the-at-error-directive"></a> |
214 | 214 | #### `@error` 指令 | … | … |
241 | 241 | <a name="repopulating-forms"></a> |
242 | 242 | ### 回填表单 |
243 | 243 | |
244 | 当 Laravel 由于验证错误而生成重定向响应时,框架将自动 [将所有请求的输入闪存到 session 中](/docs/laravel/9.x/session#flash-data)。 | |
244 | 当 Laravel 由于验证错误而生成重定向响应时,框架将自动 [将所有请求的输入闪存到 session 中](/docs/laravel/9.x/session#flash-data)。这样做是为了方便你在下一个请求期间访问输入,并重新填充用户尝试提交的表单。 | |
245 | 245 | |
246 | 246 | 要从先前的请求中检索闪存的输入,请在 `Illuminate\Http\Request` 的实例上调用 `old` 方法。 `old` 方法将从 [session](/docs/laravel/9.x/session) 中提取先前闪存的输入数据: |
247 | 247 | … | … |
359 | 359 | <a name="customizing-the-redirect-location"></a> |
360 | 360 | #### 自定义重定向 |
361 | 361 | |
362 | 如前所述,当表单请求验证失败时,将会生成一个让用户返回到先前位置的重定向响应。 | |
362 | 如前所述,当表单请求验证失败时,将会生成一个让用户返回到先前位置的重定向响应。当然,您也可以自由定义此行为。如果您要这样做,可以在表单请求中定义一个 `$redirect` 属性: | |
363 | 363 | |
364 | 364 | /** |
365 | 365 | * 如果验证失败,用户应重定向到的 URI。 | … | … |
549 | 549 | 'body' => 'required', |
550 | 550 | ])->validate(); |
551 | 551 | |
552 | ||
553 | 552 | 如果校验失败,您可以使用 `validateWithBag` 方法将错误信息存储到 [命名错误包](#named-error-bags) 中 |
554 | 553 | |
555 | 554 | Validator::make($request->all(), [ | … | … |
593 | 592 | <a name="specifying-a-custom-message-for-a-given-attribute"></a> |
594 | 593 | #### 为给定属性指定自定义消息 |
595 | 594 | |
596 | 有时您可能希望只为特定属性指定自定义错误消息。您可以使用 | |
595 | 有时您可能希望只为特定属性指定自定义错误消息。您可以使用 `.` 表示法。首先指定属性名称,然后指定规则: | |
597 | 596 | |
598 | 597 | $messages = [ |
599 | 598 | 'email.required' => 'We need to know your email address!', | … | … |
908 | 907 | <a name="rule-after-or-equal"></a> |
909 | 908 | #### after\_or\_equal:_date_ |
910 | 909 | |
911 | 待验证字段的值对应的日期必须在给定日期之后或与给定的日期相同。可参阅 [after](#rule-after) 规则获取更多信息。 | |
910 | 待验证字段的值对应的日期必须在给定日期之后或与给定的日期相同。可参阅 [after](#rule-after) 规则获取更多信息。 | |
912 | 911 | |
913 | 912 | <a name="rule-alpha"></a> |
914 | 913 | #### alpha |
915 | 914 | |
916 | 待验证字段只能由字母组成。 | |
915 | 待验证字段只能由字母组成。 | |
917 | 916 | |
918 | 917 | <a name="rule-alpha-dash"></a> |
919 | 918 | #### alpha_dash | … | … |
932 | 931 | |
933 | 932 | 待验证字段必须是有效的 PHP 数组。 |
934 | 933 | |
935 | 当向 `array` 规则提供附加值时,输入数组中的每个键都必须出现在提供给规则的值列表中。 | |
934 | 当向 `array` 规则提供附加值时,输入数组中的每个键都必须出现在提供给规则的值列表中。在以下示例中,输入数组中的 `admin` 键无效,因为它不包含在提供给 `array` 规则的值列表中: | |
936 | 935 | |
937 | 936 | use Illuminate\Support\Facades\Validator; |
938 | 937 | … | … |
953 | 952 | <a name="rule-bail"></a> |
954 | 953 | #### bail |
955 | 954 | |
956 | 在首次验证失败后立即终止验证。 | |
955 | 在首次验证失败后立即终止验证。 | |
957 | 956 | |
958 | 957 | 虽然 `bail` 规则只会在遇到验证失败时停止验证特定字段,但 `stopOnFirstFailure` 方法会通知验证器,一旦发生单个验证失败,它应该停止验证所有属性: |
959 | 958 | … | … |
976 | 975 | <a name="rule-between"></a> |
977 | 976 | #### between:_min_,_max_ |
978 | 977 | |
979 | 验证字段的大小必须在给定的 min 和 max 之间。字符串、数字、数组和文件的计算方式都使用 [`size`](#rule-size) 方法。 | |
978 | 验证字段的大小必须在给定的 min 和 max 之间。字符串、数字、数组和文件的计算方式都使用 [`size`](#rule-size) 方法。 | |
980 | 979 | |
981 | 980 | <a name="rule-boolean"></a> |
982 | 981 | #### boolean |
983 | 982 | |
984 | 验证的字段必须可以转换为 Boolean 类型。 可接受的输入为 `true`, `false`, `1`, `0`, `"1"`, 和 `"0"` | |
983 | 验证的字段必须可以转换为 Boolean 类型。 可接受的输入为 `true`, `false`, `1`, `0`, `"1"`, 和 `"0"`。 | |
985 | 984 | |
986 | 985 | <a name="rule-confirmed"></a> |
987 | 986 | #### confirmed | … | … |
1003 | 1002 | <a name="rule-date-equals"></a> |
1004 | 1003 | #### date_equals:_date_ |
1005 | 1004 | |
1006 | 验证字段必须等于给定日期。日期将传递到 PHP `strtotime` 函数中,以便转换为有效的 `DateTime` 实例。 | |
1005 | 验证字段必须等于给定日期。日期将传递到 PHP `strtotime` 函数中,以便转换为有效的 `DateTime` 实例。 | |
1007 | 1006 | |
1008 | 1007 | <a name="rule-date-format"></a> |
1009 | 1008 | … | … |
1067 | 1066 | <a name="rule-distinct"></a> |
1068 | 1067 | #### distinct |
1069 | 1068 | |
1070 | 验证数组时,指定的字段不能有任何重复值 | |
1069 | 验证数组时,指定的字段不能有任何重复值: | |
1071 | 1070 | |
1072 | 1071 | 'foo.*.id' => 'distinct' |
1073 | 1072 | |
1074 | Distinct 默认使用松散的变量比较。要使用严格比较,您可以将`strict`参数添加到验证规则定义中 | |
1073 | Distinct 默认使用松散的变量比较。要使用严格比较,您可以将`strict`参数添加到验证规则定义中: | |
1075 | 1074 | |
1076 | 1075 | 'foo.*.id' => 'distinct:strict' |
1077 | 1076 | |
1078 | 你可以在验证规则的参数中添加 `ignore_case` ,以使规则忽略大小写差异: | |
1077 | 你可以在验证规则的参数中添加 `ignore_case` ,以使规则忽略大小写差异: | |
1079 | 1078 | |
1080 | 1079 | 'foo.*.id' => 'distinct:ignore_case' |
1081 | 1080 | |
1082 | 1081 | <a name="rule-email"></a> |
1083 | 1082 | |
1084 | 1083 | |
1085 | 验证的字段必须符合 `e-mail` 地址格式。当前版本,此种验证规则由[`egulias/email-validator`](https://github.com/egulias/EmailValidator) 提供支持。默认情况下,使用 `RFCValidation` 验证样式,但你也可以应用其他验证样式 | |
1084 | 验证的字段必须符合 `e-mail` 地址格式。当前版本,此种验证规则由[`egulias/email-validator`](https://github.com/egulias/EmailValidator) 提供支持。默认情况下,使用 `RFCValidation` 验证样式,但你也可以应用其他验证样式: | |
1086 | 1085 | |
1087 | 1086 | 'email' => 'email:rfc,dns' |
1088 | 1087 | |
1089 | 上面的示例将应用 `RFCValidation` 和 `DNSCheckValidation` 验证。以下是你可以应用的验证样式的完整列表 | |
1088 | 上面的示例将应用 `RFCValidation` 和 `DNSCheckValidation` 验证。以下是你可以应用的验证样式的完整列表: | |
1090 | 1089 | |
1091 | 1090 | <div class="content-list" markdown="1"> |
1092 | 1091 | … | … |
1110 | 1109 | <a name="rule-enum"></a> |
1111 | 1110 | #### enum |
1112 | 1111 | |
1113 | `Enum` 规则是一个基于类的规则,验证指定的字段是否包含一个有效的枚举值。`Enum` 规则接受枚举的名称作为其唯一的构造函数参数 | |
1112 | `Enum` 规则是一个基于类的规则,验证指定的字段是否包含一个有效的枚举值。`Enum` 规则接受枚举的名称作为其唯一的构造函数参数: | |
1114 | 1113 | |
1115 | 1114 | use App\Enums\ServerStatus; |
1116 | 1115 | use Illuminate\Validation\Rules\Enum; | … | … |
1119 | 1118 | 'status' => [new Enum(ServerStatus::class)], |
1120 | 1119 | ]); |
1121 | 1120 | |
1122 | > 注意:枚举仅适用于PHP 8.1+ | |
1121 | > 注意:枚举仅适用于PHP 8.1+。 | |
1123 | 1122 | |
1124 | 1123 | |
1125 | 1124 | … | … |
1172 | 1171 | |
1173 | 1172 | 'user_id' => 'exists:App\Models\User,id' |
1174 | 1173 | |
1175 | 如果你想要自定义一个执行查询的验证规则,你可以使用 | |
1174 | 如果你想要自定义一个执行查询的验证规则,你可以使用 `Rule` 类去流畅地定义规则。在这个例子中,我们也将指定验证规则为一个数组,而不再是使用 `|` 分割他们: | |
1176 | 1175 | |
1177 | 1176 | use Illuminate\Support\Facades\Validator; |
1178 | 1177 | use Illuminate\Validation\Rule; | … | … |
1215 | 1214 | <a name="rule-in"></a> |
1216 | 1215 | #### in:_foo_,_bar_,... |
1217 | 1216 | |
1218 | 验证 | |
1217 | 验证字段必须包含在给定的值列表中。由于此规则通常要求你 `implode` 数组,因此可以使用`Rule::in` 方法来流畅地构造规则: | |
1219 | 1218 | |
1220 | 1219 | use Illuminate\Support\Facades\Validator; |
1221 | 1220 | use Illuminate\Validation\Rule; | … | … |
1227 | 1226 | ], |
1228 | 1227 | ]); |
1229 | 1228 | |
1230 | 当 `in` 规则与 `array` 规则结合使用时,输入数组中的每个值都必须出现在提供给 `in` 规则的值列表中。 在以下示例中,输入数组中的 | |
1229 | 当 `in` 规则与 `array` 规则结合使用时,输入数组中的每个值都必须出现在提供给 `in` 规则的值列表中。 在以下示例中,输入数组中的「LAS」机场代码无效,因为它不包含在提供给 `in` 规则的机场列表中: | |
1231 | 1230 | |
1232 | 1231 | use Illuminate\Support\Facades\Validator; |
1233 | 1232 | use Illuminate\Validation\Rule; | … | … |
1254 | 1253 | |
1255 | 1254 | 验证字段必须是整数。 |
1256 | 1255 | |
1257 | > 注意:此验证规则不会验证输入是否为“整数”变量类型,仅验证输入是否为 PHP 的 | |
1256 | > 注意:此验证规则不会验证输入是否为“整数”变量类型,仅验证输入是否为 PHP 的 `FILTER_VALIDATE_INT` 规则所接受的类型。 如果您需要将输入验证为数字,请将此规则与 [`numeric` 验证规则](#rule-numeric) 结合使用。 | |
1258 | 1257 | |
1259 | 1258 | <a name="rule-ip"></a> |
1260 | 1259 | #### ip | … | … |
1291 | 1290 | <a name="rule-lte"></a> |
1292 | 1291 | #### lte:_field_ |
1293 | 1292 | |
1294 | 验证中的字段必须小于或等于给定的 | |
1293 | 验证中的字段必须小于或等于给定的字段 。这两个字段必须是相同的类型。字符串、数值、数组和文件大小的计算方式与 [`size`](#rule-size) 方法进行评估。 | |
1295 | 1294 | |
1296 | 1295 | <a name="rule-max"></a> |
1297 | 1296 | #### max:_value_ | … | … |
1326 | 1325 | <a name="rule-min"></a> |
1327 | 1326 | #### min:_value_ |
1328 | 1327 | |
1329 | 验证字段必须具有最小值 _value_ 。 | |
1328 | 验证字段必须具有最小值 _value_ 。字符串,数值,数组,文件大小的计算方式都与 [`size`](#rule-size) 规则一致。 | |
1330 | 1329 | |
1331 | 1330 | <a name="multiple-of"></a> |
1332 | 1331 | #### multiple_of:_value_ | … | … |
1354 | 1353 | |
1355 | 1354 | 验证字段必须与给定的正则表达式不匹配。 |
1356 | 1355 | |
1357 | 验证时,这个规则使用 PHP `preg_match` 函数。指定的模式应遵循 `preg_match` 所需的相同格式,也包括有效的分隔符。 例如: `'email' => 'not_regex:/^.+$/i'` | |
1356 | 验证时,这个规则使用 PHP `preg_match` 函数。指定的模式应遵循 `preg_match` 所需的相同格式,也包括有效的分隔符。 例如: `'email' => 'not_regex:/^.+$/i'`。 | |
1358 | 1357 | |
1359 | 1358 | > 注意:当使用 `regex` / `not_regex` 模式时, 可能需要在数组中指定规则,而不是使用 `|` 分隔符 ,特别是在正则表达式包含 `|` 字符 的情况下。 |
1360 | 1359 | … | … |
1363 | 1362 | <a name="rule-nullable"></a> |
1364 | 1363 | #### nullable |
1365 | 1364 | |
1366 | 验证字段可以为 | |
1365 | 验证字段可以为 `null`。 | |
1367 | 1366 | |
1368 | 1367 | <a name="rule-numeric"></a> |
1369 | 1368 | #### numeric | … | … |
1416 | 1415 | <a name="rule-required"></a> |
1417 | 1416 | #### required |
1418 | 1417 | |
1419 | 验证中的字段必须存在于输入数据中,并且不能为空。 | |
1418 | 验证中的字段必须存在于输入数据中,并且不能为空。如果以下条件之一为真,则字段被视为「空」: | |
1420 | 1419 | |
1421 | 1420 | <div class="content-list" markdown="1"> |
1422 | 1421 | |
1423 | - 值为 | |
1422 | - 值为 `null`。 | |
1424 | 1423 | - 该值为空字符串。 |
1425 | 1424 | - 该值是一个空数组或空的 `Countable` 对象。 |
1426 | 1425 | - 该值是一个没有路径的上传文件。 | … | … |
1487 | 1486 | <a name="rule-size"></a> |
1488 | 1487 | #### size:_value_ |
1489 | 1488 | |
1490 | 验证字段的大小必须与给定的_value_匹配。 | |
1489 | 验证字段的大小必须与给定的_value_匹配。对于字符串数据,_value_ 对应于字符数。 对于数字数据,_value_ 对应于给定的整数值(属性还必须具有 `numeric` 或 `integer` 规则)。 对于数组,_size_ 对应于数组的 `count`。 对于文件,_size_ 对应于以千字节为单位的文件大小。 让我们看一些例子: | |
1491 | 1490 | |
1492 | 1491 | // 验证一个字符串是否正好是 12 个字符长... |
1493 | 1492 | 'title' => 'size:12'; | … | … |
1557 | 1556 | ], |
1558 | 1557 | ]); |
1559 | 1558 | |
1560 | > 注意:你不应该将任何用户控制的请求输入传递给 `ignore` 方法。 | |
1559 | > 注意:你不应该将任何用户控制的请求输入传递给 `ignore` 方法。相反,您应该只传递系统生成的唯一 ID,例如来自 Eloquent 模型实例的自动递增 ID 或 UUID。否则,您的应用程序将容易受到 SQL 注入攻击。 | |
1561 | 1560 | |
1562 | 1561 | 除了将模型键的值传递给 `ignore` 方法,您还可以传递整个模型实例。 Laravel 会自动从模型中提取密钥: |
1563 | 1562 | … | … |
1567 | 1566 | |
1568 | 1567 | Rule::unique('users')->ignore($user->id, 'user_id') |
1569 | 1568 | |
1570 | 默认情况下,`unique` 规则将检查与正在验证的属性名称匹配的列的唯一性。 | |
1569 | 默认情况下,`unique` 规则将检查与正在验证的属性名称匹配的列的唯一性。但是,您可以将不同的列名作为第二个参数传递给 `unique` 方法: | |
1571 | 1570 | |
1572 | 1571 | Rule::unique('users', 'email_address')->ignore($user->id), |
1573 | 1572 | |
1574 | 1573 | **添加额外的 Where 子句:** |
1575 | 1574 | |
1576 | 您可以通过使用 `where` 方法自定义查询来指定其他查询条件。 | |
1575 | 您可以通过使用 `where` 方法自定义查询来指定其他查询条件。例如,让我们添加一个查询条件,将查询范围限定为仅搜索 `account_id` 列值为 `1` 的记录: | |
1577 | 1576 | |
1578 | 1577 | 'email' => Rule::unique('users')->where(function ($query) { |
1579 | 1578 | return $query->where('account_id', 1); | … | … |
1633 | 1632 | <a name="complex-conditional-validation"></a> |
1634 | 1633 | #### 复杂的条件验证 |
1635 | 1634 | |
1636 | 有时您可能希望基于更复杂的条件逻辑添加验证规则。 | |
1635 | 有时您可能希望基于更复杂的条件逻辑添加验证规则。例如,您可能希望仅当另一个字段的值大于 100 时才需要给定字段。或者,您可能需要两个字段才能仅在另一个字段存在时才具有给定值。 添加这些验证规则并不一定很痛苦。首先,使用您的_静态规则_创建一个永远不会改变的 `Validator` 实例: | |
1637 | 1636 | |
1638 | 1637 | use Illuminate\Support\Facades\Validator; |
1639 | 1638 | … | … |
1642 | 1641 | 'games' => 'required|numeric', |
1643 | 1642 | ]); |
1644 | 1643 | |
1645 | 假设我们的 Web 应用程序是面向游戏收藏家的。 | |
1644 | 假设我们的 Web 应用程序是面向游戏收藏家的。如果游戏收藏家在我们的应用程序中注册并且他们拥有超过 100 款游戏,我们希望他们解释为什么他们拥有这么多游戏。 例如,他们可能经营一家游戏转售店,或者他们只是喜欢收集游戏。要有条件地添加此要求,我们可以在 `Validator` 实例上使用 `sometimes` 方法。 | |
1646 | 1645 | |
1647 | 1646 | $validator->sometimes('reason', 'required|max:500', function ($input) { |
1648 | 1647 | return $input->games >= 100; | … | … |
1661 | 1660 | <a name="complex-conditional-array-validation"></a> |
1662 | 1661 | #### 复杂的条件数组验证 |
1663 | 1662 | |
1664 | 有时您可能希望根据同一嵌套数组中的另一个字段来验证一个字段,该数组的索引您不知道。 | |
1663 | 有时您可能希望根据同一嵌套数组中的另一个字段来验证一个字段,该数组的索引您不知道。在这些情况下,您可以允许您的闭包接收第二个参数,该参数将是正在验证的数组中的当前单个项目: | |
1665 | 1664 | |
1666 | 1665 | $input = [ |
1667 | 1666 | 'channels' => [ | … | … |
1684 | 1683 | return $item->type !== 'email'; |
1685 | 1684 | }); |
1686 | 1685 | |
1687 | 与传递给闭包的 `$input` 参数一样,当属性数据是数组时,`$item` 参数是 `Illuminate\Support\Fluent` 的实例; | |
1686 | 与传递给闭包的 `$input` 参数一样,当属性数据是数组时,`$item` 参数是 `Illuminate\Support\Fluent` 的实例;否则,它是一个字符串。 | |
1688 | 1687 | |
1689 | 1688 | <a name="validating-arrays"></a> |
1690 | 1689 | ## 验证数组 |
1691 | 1690 | |
1692 | 正如 [`array` 验证规则文档](#rule-array) 中所讨论的,`array` 规则接受允许的数组键列表。 | |
1691 | 正如 [`array` 验证规则文档](#rule-array) 中所讨论的,`array` 规则接受允许的数组键列表。如果数组中存在任何其他键,则验证将失败: | |
1693 | 1692 | |
1694 | 1693 | use Illuminate\Support\Facades\Validator; |
1695 | 1694 | … | … |
1705 | 1704 | 'user' => 'array:username,locale', |
1706 | 1705 | ]); |
1707 | 1706 | |
1708 | 通常,您应该始终指定允许出现在数组中的数组键。 | |
1707 | 通常,您应该始终指定允许出现在数组中的数组键。否则,验证器的 `validate` 和 `validated` 方法将返回所有经过验证的数据,包括数组及其所有键,即使这些键没有被其他嵌套数组验证规则验证。 | |
1709 | 1708 | |
1710 | 1709 | <a name="validating-nested-array-input"></a> |
1711 | 1710 | ### 验证嵌套数组输入 | … | … |
1720 | 1719 | |
1721 | 1720 | |
1722 | 1721 | |
1723 | 您还可以验证数组的每个元素。 | |
1722 | 您还可以验证数组的每个元素。例如,要验证给定数组输入字段中的每封电子邮件是否唯一,您可以执行以下操作: | |
1724 | 1723 | |
1725 | 1724 | $validator = Validator::make($request->all(), [ |
1726 | 1725 | 'person.*.email' => 'email|unique:users', | … | … |
1738 | 1737 | <a name="accessing-nested-array-data"></a> |
1739 | 1738 | #### 访问嵌套数组数据 |
1740 | 1739 | |
1741 | 有时,在为属性分配验证规则时,您可能需要访问给定嵌套数组元素的值。 | |
1740 | 有时,在为属性分配验证规则时,您可能需要访问给定嵌套数组元素的值。您可以使用 `Rule::foreEach` 方法完成此操作。 `forEach` 方法接受一个闭包,该闭包将为验证中的数组属性的每次迭代调用,并将接收属性的值和显式的、完全扩展的属性名称。闭包应该返回一个规则数组来分配给数组元素: | |
1742 | 1741 | |
1743 | 1742 | use App\Rules\HasPermission; |
1744 | 1743 | use Illuminate\Support\Facades\Validator; | … | … |
1756 | 1755 | <a name="validating-passwords"></a> |
1757 | 1756 | ## 验证密码 |
1758 | 1757 | |
1759 | 为确保密码具有足够的复杂性,您可以使用 Laravel 的 | |
1758 | 为确保密码具有足够的复杂性,您可以使用 Laravel 的 `password` 规则对象: | |
1760 | 1759 | |
1761 | 1760 | use Illuminate\Support\Facades\Validator; |
1762 | 1761 | use Illuminate\Validation\Rules\Password; | … | … |
1790 | 1789 | |
1791 | 1790 | 在内部,`Password` 规则对象使用 [k-Anonymity](https://en.wikipedia.org/wiki/K-anonymity) 模型来确定密码是否已通过 [haveibeenpwned.com](https ://haveibeenpwned.com) 服务而不牺牲用户的隐私或安全。 |
1792 | 1791 | |
1793 | 默认情况下,如果密码在数据泄露中至少出现一次,则会被视为已泄露。 | |
1792 | 默认情况下,如果密码在数据泄露中至少出现一次,则会被视为已泄露。您可以使用 `uncompromised` 方法的第一个参数自定义此阈值: | |
1794 | 1793 | |
1795 | 1794 | // 确保密码在同一数据泄露中出现少于 3 次... |
1796 | 1795 | Password::min(8)->uncompromised(3); | … | … |
1914 | 1913 | |
1915 | 1914 | #### 访问附加数据 |
1916 | 1915 | |
1917 | 如果您的自定义验证规则类需要访问所有其他正在验证的数据,您的规则类可以实现 `Illuminate\Contracts\Validation\DataAwareRule` 接口。 | |
1916 | 如果您的自定义验证规则类需要访问所有其他正在验证的数据,您的规则类可以实现 `Illuminate\Contracts\Validation\DataAwareRule` 接口。这个接口需要你的类定义一个 `setData` 方法。Laravel 将自动调用此方法(在验证进行之前),`$data` 包含所有即将验证的数据: | |
1918 | 1917 | |
1919 | 1918 | <?php |
1920 | 1919 | … | … |
1987 | 1986 | |
1988 | 1987 | ### 使用闭包 |
1989 | 1988 | |
1990 | 如果您在整个应用程序中只需要一次自定义规则的功能,您可以使用闭包而不是规则对象。 | |
1989 | 如果您在整个应用程序中只需要一次自定义规则的功能,您可以使用闭包而不是规则对象。闭包接收属性的名称、属性的值和一个在验证失败时应该调用的 `$fail` 回调: | |
1991 | 1990 | |
1992 | 1991 | use Illuminate\Support\Facades\Validator; |
1993 | 1992 | … | … |
2006 | 2005 | <a name="implicit-rules"></a> |
2007 | 2006 | ### 隐式规则 |
2008 | 2007 | |
2009 | 默认情况下,当正在验证的属性不存在或包含空字符串时,不会运行正常的验证规则,包括自定义规则。 | |
2008 | 默认情况下,当正在验证的属性不存在或包含空字符串时,不会运行正常的验证规则,包括自定义规则。例如,[`unique`](#rule-unique) 规则不会针对空字符串运行: | |
2010 | 2009 | |
2011 | 2010 | use Illuminate\Support\Facades\Validator; |
2012 | 2011 | … | … |
2016 | 2015 | |
2017 | 2016 | Validator::make($input, $rules)->passes(); // true |
2018 | 2017 | |
2019 | 要使自定义规则即使在属性为空时也能运行,该规则必须暗示该属性是必需的。 | |
2018 | 要使自定义规则即使在属性为空时也能运行,该规则必须暗示该属性是必需的。要创建「隐式」规则,请实现 Illuminate\Contracts\Validation\ImplicitRule 接口。 该接口用作验证器的「标识接口」;因此,除了典型的 `Rule` 接口所需的方法之外,它不包含您需要实现的任何其他方法。 | |
2020 | 2019 | |
2021 | 2020 | 要生成新的隐式规则对象,您可以使用带有 `--implicit` 选项的 `make:rule` Artisan 命令: |
2022 | 2021 | … | … |
2024 | 2023 | php artisan make:rule Uppercase --implicit |
2025 | 2024 | ``` |
2026 | 2025 | |
2027 | > 注意: | |
2026 | > 注意:「隐式」规则仅_implicit_该属性是必需的。 它是否实际上使缺失或空属性无效取决于您。 | |
2028 | 2027 | |
2029 | 2028 |