Php Laravel Ajax响应和错误处理

Php Laravel Ajax响应和错误处理,php,ajax,laravel,response,Php,Ajax,Laravel,Response,这是我的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> <inp

这是我的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>
控制台消息

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

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

您可能正在尝试在不同的级别上工作。假设您没有在ajax脚本中处理错误响应,blade无法知道错误响应,因为html页面是由控制器按原样提供的,在下次刷新之前不会更改。如果您想让blade知道响应,您需要异步捕获它,即ajax级别。
假设您再次发布标准ajax请求,您可以执行以下操作:

    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  
                });
            }
        });  
var form=$(“#您的表单id”);
$.ajax({
url:form.attr('action'),
键入:“POST”,
数据:form.serialize(),
成功:功能(数据){
//成功职位
//你想干什么就干什么
},
错误:函数(数据){
//出了点问题
//在这里,您可以异步处理响应
//登录控制台
var errors=data.responseJSON;
console.log(错误);
//或者,你想要实现什么
//通过js呈现响应,将错误推送到
//刀片页
errorsHtml='
    '; $.each(errors.error,函数(键,值){ errorsHtml+='
  • '+值[0]+'
  • ';//仅显示第一个错误。 }); errorsHtml+='
'; $(“#表单错误”).html(errorsHtml);//附加到内部表单 }); } });

请注意,您需要在您的发布表单中添加一个
#表单错误
div,以使其正常工作。

希望这对您有所帮助

        $.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  
                });
            }
        }); 
$.ajax({
url:form.attr('action'),
键入:“POST”,
数据:form.serialize(),
成功:功能(数据){
//你想干什么就干什么
},
错误:函数(数据){
//登录控制台
var errors=data.responseJSON;
console.log(错误);
//或者,你想要实现什么
//通过js呈现响应,将错误推送到
//刀片页
var errors=response.responseJSON;
errorsHtml='
    '; $.each(错误、错误、函数(k、v){ errorsHtml+='
  • '+v+'
  • '; }); errorsHtml+='
'; $('error#u message').html(errorsHtml); //附加到窗体内部的 }); } });
以下是更简洁的解决方案。快乐黑客:)

.fail((err)=>{
让allErrors=Object.values(err.responseJSON)
.map(el=>(
el=`
  • ${el}
  • ` )) .减少((下一个,上一个)=>(下一个=上一个+下一个)); 常量设置错误=`
      ${allErrors}
    `; $('.modalerror').html(setErrors); }) .始终((数据)=>{ });
  • ”+值[0]+”
  • ;你为什么喜欢那样?我们需要价值[关键]ithink@CihanKüsmez yea,
    如果出现多个错误。我确实指定它只显示一个错误,我相信这取决于您的需要。$.each(数据,函数(键,值){应该是$.each(errors.errors,函数(键,值){这是Laravel 5+的解决方案。谢谢。
            $.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  
                    });
                }
            }); 
    
       .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) => {
        
      });