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.phpattributes数组中指定该自定义名称:

'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.

查看笔记

扫码一下
查看教程更方便