AJAX模式下的验证错误

use*_*178 21 php laravel laravel-4

目前我使用它来通过ajax显示验证错误:

            if (data.validation_failed == 1)
            {
                var arr = data.errors;
                $.each(arr, function(index, value)
                {
                    if (value.length != 0)
                    {
                        $("#validation-errors").append('<div class="alert alert-error"><strong>'+ value +'</strong><div>');
                    }
                });
                $('#ajax-loading').hide();
                $("#validation-errors").show();
            }
Run Code Online (Sandbox Code Playgroud)

它工作正常,完全符合我的需要.

问题是我必须做的就是将错误从laravel传输到ajax:

    $rules = array( 
        'name'  => 'required',
        'password' => 'required'
    );

    $v = Validator::make(Input::all(), $rules);

    if ( ! $v->passes())
    {

    $messages = $v->messages();

    foreach ($rules as $key => $value)
    {
        $verrors[$key] = $messages->first($key);
    }

        if(Request::ajax())
        {                    
            $response_values = array(
                'validation_failed' => 1,
                'errors' => $verrors);              
        return Response::json($response_values);
        }
        else
        {
        return Redirect::to('login')
            ->with('validation_failed', 1)
            ->withErrors($v);
        }       

    }
Run Code Online (Sandbox Code Playgroud)

如果我想将字段名称作为键,我必须迭代$ rules,但即使我不使用字段名作为键,但我必须迭代错误消息来构造$ verrors.

如何在不需要迭代$v->messages()$verrors情况下转换为等效的?因为Response::json()期待一个数组而不是一个对象.

Der*_*ola 71

最简单的方法是利用MessageBag验证器的对象.这可以这样做:

// Setup the validator
$rules = array('username' => 'required|email', 'password' => 'required');
$validator = Validator::make(Input::all(), $rules);

// Validate the input and return correct response
if ($validator->fails())
{
    return Response::json(array(
        'success' => false,
        'errors' => $validator->getMessageBag()->toArray()

    ), 400); // 400 being the HTTP code for an invalid request.
}
return Response::json(array('success' => true), 200);
Run Code Online (Sandbox Code Playgroud)

这会给你一个像这样的JSON响应:

{
    "success": false,
    "errors": {
        "username": [
            "The username field is required."
        ],
        "password": [
            "The password field is required."
        ]
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这可能是一个愚蠢的评论 - 但将 http 代码设置为 400 是否意味着 JSON 响应被完全忽略? (2认同)
  • 取决于'客户'阅读JSON.例如jQuery处理这个非常好.它不会触发成功,但会触发错误回调,这就是你想要的. (2认同)
  • 使用 jQuery,您可以在 ajax 请求中使用以下代码获取错误: `error: function(xhr, status, data){ console.log(xhr.responseJSON.errors); }` (2认同)

小智 13

在ajax响应尝试类似的东西

    .fail(function( data ) {
        var response = JSON.parse(data.responseText);
        var errorString = '<ul>';
        $.each( response.errors, function( key, value) {
            errorString += '<li>' + value + '</li>';
        });
        errorString += '</ul>';
Run Code Online (Sandbox Code Playgroud)


Sag*_*ara 9

Laravel 5 自动返回验证错误

为此你只需要做以下事情,

控制器:

public function methodName(Request $request)
{
    $this->validate($request,[
        'field-to-validate' => 'required'
    ]);

    // if it's correctly validated then do the stuff here

    return new JsonResponse(['data'=>$youCanPassAnything],200);
}
Run Code Online (Sandbox Code Playgroud)

看法:

         $.ajax({
            type: 'POST',
            url: 'url-to-call',
            data: {
                "_token": "{{ csrf_token() }}",
                "field": $('#field').cal()
            },
            success: function (data) {
                console.log(data);
            },
            error: function (reject) {
                if( reject.status === 422 ) {
                    var errors = $.parseJSON(reject.responseText);
                    $.each(errors, function (key, val) {
                        $("#" + key + "_error").text(val[0]);
                    });
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)

您可以为每个validation字段构建一个<span>带有 id 作为字段名称和后缀的标签,_error因此它将显示具有上述逻辑的验证错误,如下所示,

<span id="field_error"></span>
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你 :)


Seo*_*Era 7

试试这个代码。它运作良好:

$.ajaxSetup({
    headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')}
});



$("#sendData").submit(function(e) 
{
    e.preventDefault();
    var formData  = new FormData(jQuery('#sendData')[0]);
    $.ajax({

       type:'POST',
       url:"/your(URL)",
       data:formData,
        contentType: false,
        processData: false,
       success:function(data)
       {
          alert(data);
       },
        error: function(xhr, status, error) 
        {

          $.each(xhr.responseJSON.errors, function (key, item) 
          {
            $("#errors").append("<li class='alert alert-danger'>"+item+"</li>")
          });

        }

    });

});
Run Code Online (Sandbox Code Playgroud)

  • 虽然此代码可能会回答问题,但提供有关此代码为什么和/或如何回答问题的附加上下文可提高其长期价值。 (2认同)

Rak*_*hra 5

我在 laravel 5.5 中使用这种方式处理它

网页代码

<div class="form-group  padding">
  <label for="">Kalyan Mandap Name <span class="text-danger">*</span></label>
  <input type="text" class="form-control" placeholder="Enter Kalyan Mandap Name" id="mandapName" name="mandapName" value = "<?php echo (isset($mandapDetails['vchKalyanMandapName'])) ? $mandapDetails['vchKalyanMandapName'] : ""; ?>" required="required">
  <span class="text-danger">{!! $errors->first('mandapName', ':message') !!} </span>
</div>
Run Code Online (Sandbox Code Playgroud)

控制器验证码

 // Validate form data
    $validatedData = request()->validate([
      'mandapName' => 'required',
      'location' => 'required',
      'landmark' => 'required',
      'description' => 'required',
      'contactNo' => 'required',
      'slug' => 'required',
      'functional' => 'required'
    ]);
Run Code Online (Sandbox Code Playgroud)

在 JavaScript 中

     $.ajax({
        //.....Your ajax configuration
        success: function (data) {
            // Success code

        },
        error: function (request, status, error) {
            $('[name="mandapName"]').next('span').html(request.responseJSON.errors.mandapName);
            //.......
        }
    });
Run Code Online (Sandbox Code Playgroud)