Laravel 处理错误消息
当调用Validator实例的errors
方法后,我们会收到一个Illuminate\Support\MessageBag
实例,该实例具有用于处理错误消息的多种便捷方法。$errors自动创建的$errors变量(所有的视图都可以访问)也是MessageBag
类的一个实例。
检索字段的第一条错误消息
要检索给定字段的第一条错误消息,可以使用first
方法:
$errors = $validator->errors();
echo $errors->first('email');
检索字段的所有错误消息
如果需要检索给定字段的所有消息,可以使用get
方法:
foreach ($errors->get('email') as $message) {
//
}
如果要验证的表单的字段是一个数组,则可以使用*
字符检索每个数组元素的所有消息:
foreach ($errors->get('attachments.*') as $message) {
//
}
检索所有字段的所有错误消息
要检索所有字段的消息,可以使用all
方法:
foreach ($errors->all() as $message) {
//
}
确定某个字段是否存在
has
方法可用于确定给定字段是否存在任何错误消息:
if ($errors->has('email')) {
//
}
自定义错误消息
如果需要,我们可以使用自定义错误消息进行验证,而不使用默认值。有几种指定自定义消息的方法。首先,我们可以将自定义的消息作为第三个参数传递给Validator::make
方法:
$messages = [
'required' => 'The :attribute field is required.',
];
$validator = Validator::make($input, $rules, $messages);
在此示例中,:attribute占位符将被验证中的字段的实际名称替换。也可以在验证消息中使用其他占位符。例如:
$messages = [
'same' => 'The :attribute and :other must match.',
'size' => 'The :attribute must be exactly :size.',
'between' => 'The :attribute value :input is not 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
。将消息添加到语言文件resources/lang/xx/validation.php
中的custom数组中。
'custom' => [
'email' => [
'required' => 'We need to know your e-mail address!',
],
],
指定自定义属性值
如果希望将验证消息的一部分:attribute
替换为自定义属性名称,则可以在语言文件resources/lang/xx/validation.php
的attributes
数组中指定该自定义名称:
'attributes' => [
'email' => 'email address',
],
我们也可以将自定义属性作为Validator::make
方法的第四个参数:
$customAttributes = [
'email' => 'email address',
];
$validator = Validator::make($input, $rules, $messages, $customAttributes);
在语言文件中指定自定义值
有时,我们可能需要将验证消息的:value
替换为值的自定义表示形式。例如,考虑下面的规则:如果字段payment_type
字段的值为cc,则credit_card_number
字段就是必须的:
$request->validate([
'credit_card_number' => 'required_if:payment_type,cc'
]);
如果此验证规则失败,将产生以下错误消息:
The credit card number field is required when payment type is cc.
如果不想将cc显示为payment_type的值,那可以给cc指定一个专门用于在视图中显示的值。这可以在语言文件中的values数组中进行指定:
'values' => [
'payment_type' => [
'cc' => 'credit card'
],
],
现在,如果验证规则失败,它将产生以下消息:
The credit card number field is required when payment type is credit card.