Ошибки проверки в режиме AJAX

В настоящее время я использую это для отображения ошибок проверки с помощью 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(); } 

Он отлично работает, делает именно то, что мне нужно.

Проблема заключается в том, что я должен сделать, чтобы переносить ошибки с 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); } } 

Если я хочу, чтобы имена полей были ключевыми, мне нужно итерации $ rules, но даже если я не использую имена полей в качестве ключа, все же мне приходится перебирать сообщения об ошибках для построения $ verrors.

Как можно преобразовать $v->messages() в эквивалент $verrors без необходимости $verrors ? Поскольку Response::json() ожидает массив вместо объекта.

Самый простой способ – использовать объект 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); 

Это даст вам ответ JSON следующим образом:

 { "success": false, "errors": { "username": [ "The username field is required." ], "password": [ "The password field is required." ] } } 

В ответе 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>'; 

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); } 

Посмотреть:

  $.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]); }); } } }); 

вы можете построить для каждого поля validation один <span> с идентификатором как имя поля и суффикс _error чтобы он отображал ошибку проверки с помощью вышеприведенной логики, как показано ниже,

 <span id="field_error"></span> 

Надеюсь, поможет 🙂

Я использую Laravel 5.1 кстати, но я думаю, что основы этого должны применяться к другим версиям. Laravel автоматически отправляет ответ об ошибке проверки. Вы можете просто сделать следующее в своем контроллере:

 public function processEmail(Request $request) { $this->validate($request, [ 'email' => 'required|email' ]); return response()->json(['message'=>'success']); } 

Затем в вашем javascript (я использую jQuery здесь):

 var params = {email: 'get-from-form-input@test.com'}; $.ajax({ url: '/test/example', method: 'POST', data: params }) .done(function( data ) { // do something nice, the response was successful }) .fail(function(jqXHR, textStatus, errorThrown) { var responseMsg = jQuery.parseJSON(jqXHR.responseText); var errorMsg = 'There was a general problem with your request'; if (responseMsg.hasOwnProperty('email')) { errorMsg = responseMsg.email; console.log(errorMsg); } // This will help you debug the response console.log(jqXHR); console.log(textStatus); console.log(errorThrown); }); 

Если вы посмотрите на выход на консоли, вы скоро увидите, как захватить все, что вы хотите, от ответа, отправленного Laravel. В этом ответе сообщения об ошибках находятся в json как пары ключ-значение, где ключ – это имя поля, которое не провело проверку, в моем примере «email». Не забудьте убедиться, что маршрут ajax настроен в файле routes.php, а метод (get / post) соответствует тому, что находится в javascript.

Существует лучший способ справиться с ошибками проверки при использовании запроса Ajax.

Создайте класс Request как обычно, например UploadFileAjaxRequest :

 public function rules() { return [ 'file' => 'required' ]; } 

Используйте его в методе контроллера:

 public function uploadFileAjax(UploadFileAjaxRequest $request) 

Если есть какая-либо ошибка, она вернет массив ошибок, который вы можете использовать в JS:

 $.ajax({ .... error: function(data) { var errors = data.responseJSON; // An array with all errors. } });