Laravel Ajax响应和处理错误

7

这是我的html文件的一部分。

<div class="form-group{{ $errors->has('address_name') ? ' has-error' : '' }}">
    <label for="address_name">{{ trans('address.address_name') }} <span class="required_field">*</span></label>
    <input name="address_name" type="text" class="form-control" id="address_name" placeholder="{{ trans('address.address_name_placeholder') }}" maxlength="30">
    @if($errors->has('address_name'))
        <span class="help-block">{{ $errors->first('address_name') }}</span>
    @endif
</div>

我需要在Laravel 5.1中处理Ajax请求的错误。以下是我用于处理错误的代码:

$validator = Validator::make($addressData, $this->rules());

    if ($validator->fails())
    {
        return response()->json([
            'success' => 'false',
            'errors'  => $validator->errors()->all(),
        ], 400);
    }
    else
    {
        //Save Address
        try
        {
            $this->insertAddress($addressData);
            return response()->json(['success' => true], 200);
        }
        catch(Exception $e)
        {
            return response()->json([
                'success' => 'false',
                'errors'  => $e->getMessage(),
            ], 400);
        }

    }

控制台信息

{"success":"false","errors":["The Address Name field is required.","The Recipient field is required.","The Address field is required."]}

我可以在控制台看到错误,但在Blade中无法访问$errors变量。我该如何解决这个问题?

3个回答

7

您可能正在尝试在不同的层面上工作。假设您的ajax脚本没有处理错误响应,那么blade就无法知道错误响应,因为HTML页面是由控制器提供的,它不会改变直到下一次刷新。如果您想让blade知道响应,您需要异步捕获它,也就是在ajax层面上。
再次假设您正在使用标准的ajax请求进行POST,您可以这样做:

    var form = $('#your-form-id');
        $.ajax({
            url: form.attr( 'action' ),
            type: 'POST',
            data: form.serialize(),
            success: function(data){
                // Successful POST
                // do whatever you want
            },
            error: function(data){
                // Something went wrong
                // HERE you can handle asynchronously the response 

                // Log in the console
                var errors = data.responseJSON;
                console.log(errors);

                // or, what you are trying to achieve
                // render the response via js, pushing the error in your 
                // blade page
                 errorsHtml = '<div class="alert alert-danger"><ul>';

                 $.each( errors.error, function( key, value ) {
                      errorsHtml += '<li>'+ value[0] + '</li>'; //showing only the first error.
                 });
                 errorsHtml += '</ul></div>';

                 $( '#form-errors' ).html( errorsHtml ); //appending to a <div id="form-errors"></div> inside form  
                });
            }
        });  

请注意,此功能需要您在发布表单中添加一个名为#form-errors
元素。

'<li>'+ value[0] + '</li>';为什么你喜欢那个?我认为我们需要value[key]。 - Cihan Küsmez
@CihanKüsmez 是的,如果你有多个错误,那么 key 就会出现。我已经指定它只显示一个错误,我相信这符合你的需求。 - MisterP
$.each( data, function( key, value ) { 应该改为 $.each( errors.errors, function( key, value ) { - Sinan Eldem

3
希望这能帮助你。
        $.ajax({
            url: form.attr( 'action' ),
            type: 'POST',
            data: form.serialize(),
            success: function(data){
                // do whatever you want
            },
            error: function(data){

                // Log in the console
                var errors = data.responseJSON;
                console.log(errors);

                // or, what you are trying to achieve
                // render the response via js, pushing the error in your 
                // blade page

                    var errors = response.responseJSON;
                   errorsHtml = '<div class="alert alert-danger"><ul>';
                  $.each(errors.errors,function (k,v) {
                         errorsHtml += '<li>'+ v + '</li>';
                  });
                  errorsHtml += '</ul></di>';

                  $( '#error_message' ).html( errorsHtml );

                   //appending to a <div id="error_message"></div> inside your form  
                });
            }
        }); 

这是 Laravel 5+ 的解决方案。谢谢。 - Kristaps J.
精美地复制自https://pretagteam.com/question/laravel-ajax-response-and-handling-errors - Kamlesh

0

这里有一个更简洁的解决方案。祝你编程愉快 :)

   .fail((err) => {     
    let allErrors = Object.values(err.responseJSON)
    .map(el => (
      el = `<li>${el}</li>`
    ))
    .reduce((next, prev) => ( next = prev + next ));   
    const setErrors = `
      <div class="alert alert-danger" role="alert">
          <ul>${allErrors}</ul>
      </div>
    `;
    $('.modalErrorr').html(setErrors);

  })       
  .always((data) => {
    
  });

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