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