【问题标题】:Get error message from Laravel validation从 Laravel 验证中获取错误消息
【发布时间】:2016-05-27 01:19:17
【问题描述】:

我使用 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 个字符。”。我该怎么做?

【问题讨论】:

    标签: php json laravel


    【解决方案1】:

    根据 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 类提供的其他验证消息getter(实际上是上面$validator->messages() 返回的对象类型)。

    消息包错误消息其他帮助程序

    转到your_laravel_project_dir/vendor/illuminate/support/MessageBag.php 并找到一些有用的方法,如keyshashasAnyfirstallisEmpty 等,在检查特定验证错误和自定义 HTTP 响应消息。

    通过查看源代码很容易理解它们的作用。这是Laravel 5.8 API reference 虽然可能不如源代码有用。

    【讨论】:

      【解决方案2】:

      如果您想在控制器内部执行此操作,您可以:

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

      你会收到第一条短信

      The email must be accepted.
      

      【讨论】:

        【解决方案3】:

        如果您使用 toastr 样式的错误显示,这将起作用:

        @if(session()->get('errors'))
            toastr.error("{{ session()->get('errors')->first() }}");
        @endif
        

        【讨论】:

          【解决方案4】:

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

          return redirect('register')->withErrors($validator, 'login');
          

          可以使用$errors 变量中的实例访问MessageBag

          {{ $errors->login->first('email') }}
          

          表单 API docs

          希望这有帮助。

          【讨论】:

            【解决方案5】:

            试试这个:

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

            【讨论】:

            • 是的,谢谢,但这只会得到第一个错误。
            【解决方案6】:

            在您的 ajax 请求中,当您获得 data 时,请尝试 data.name

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

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

            【讨论】:

            • 当然不是解决方案。数据并不总是 json 格式,错误字段并不总是名称
            • $error = $validator->messages()->toJson(); 此语句表明您正在使用json 响应。此外,json 字段包含表单中字段的名称属性。在您的情况下,名称是 namealamat
            • 如何获取 Laravel 后端的第一个错误,所以它返回“名称必须至少为 5 个字符。”
            • $error['name'] 这将给出name 的错误。
            猜你喜欢
            • 2015-04-07
            • 1970-01-01
            • 1970-01-01
            • 2012-11-05
            • 1970-01-01
            • 2021-01-29
            • 1970-01-01
            • 2013-06-08
            • 2010-12-14
            相关资源
            最近更新 更多