从Laravel验证中获取错误消息

32

我使用Laravel内置的验证器,希望能够获取第一个错误信息。

if ($validator->fails()) {
     $error = $validator->messages()->toJson();
     .....
}

当我打印错误时,这是结果

{"name":["The name must be at least 5 characters."],"alamat":["The address must be at least 5 characters."]}
在上面的示例中,我想获取第一个错误,即“名称必须至少为5个字符”。该如何做?
8个回答

63

试试这个:

if ($validator->fails()) {
   $error = $validator->errors()->first();
}

14

根据2019年的Laravel 5.8及以上版本,获取验证器中的所有错误信息非常简单:

// create the validator and make a validation here...
if ($validator->fails()) {
    $fieldsWithErrorMessagesArray = $validator->messages()->get('*');
}

你将获得字段名称和错误消息的数组数组。看起来像这样:

[
    'price'=>
        [ 
            0 => 'Price must be integer',
            1 => 'Price must be greater than 0'
        ]
    'password' => [
        [
            0 => 'Password is required'
        ]
    ]
    
]
您可以使用其他验证消息获取器,这些获取器由Illuminate\Support\MessageBag类提供(实际上是$validator->messages()返回的对象类型)。请前往your_laravel_project_dir/vendor/illuminate/support/MessageBag.php找到一些有用的方法,例如keyshashasAnyfirstallisEmpty等,在检查特定验证错误和自定义HTTP响应消息时可能会用到。通过查看源代码可以轻松理解它们的作用。这里是Laravel 5.8 API参考文档,尽管它可能比源代码更少用。

2

在您的ajax请求中,当您获取到data时,请尝试使用data.name

这将为您提供name字段的错误消息。

$.ajax({
        url: "/your-save-url",
        type: "post",
        data: serializedData,
        success: function(data) { alert(data.name)}
    });

当然这不是解决方案。数据并不总是以JSON格式存在,而错误字段也不总是名称。 - ZZZ
2
$error = $validator->messages()->toJson(); 这个语句表示您正在使用 json 响应。此外,json 字段包含表单中字段的名称属性。在您的情况下,这些名称是 namealamat - Jilson Thomas
如何在Laravel后端获取第一个错误,以便返回“名称必须至少为5个字符”。 - ZZZ
$error['name'] 这将会给出 name 的错误。 - Jilson Thomas

2

如果验证失败,可以使用withErrors方法将错误消息闪存到会话中。这是一个数组,该方法将在重定向后自动与所有视图共享$errors

return redirect('register')->withErrors($validator, 'login');
MessageBag 可以通过 $errors 变量的实例进行访问:
{{ $errors->login->first('email') }}

表单 API 文档

希望这有所帮助。


2

要获取所有错误,请尝试以下方法:

if ($validator->fails()) {
   $error = $validator->errors()->all();
}

1
如果您正在使用toastr样式的错误显示,这将起作用:
@if(session()->get('errors'))
    toastr.error("{{ session()->get('errors')->first() }}");
@endif

0

试试这个

if ($validator->fails())
{
    $error = $validator->messages()->get('name');
}

-1

如果你想在控制器内部完成它,你可以这样做:

Arr::first(Arr::flatten($validator->messages()->get('*')))

你将收到第一条文本消息

The email must be accepted.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接