Ошибки проверки в режиме 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
без необходимости повторения? Поскольку Response::json()
ожидает массив вместо объекта.
Ответы
Ответ 1
Самый простой способ - использовать 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."
]
}
}
Ответ 2
В ответе 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>';
Ответ 3
Laravel 5 автоматически возвращает ошибку проверки
для этого вам просто нужно сделать следующее,
Контроллер:
public function methodName(Request $request)
{
$this->validate($request,[
'field-to-validate' => 'required'
]);
// if it 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>
Надеюсь, это поможет:)
Ответ 4
Я использую 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: '[email protected]'};
$.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.
Ответ 5
Существует лучший способ справиться с ошибками проверки при использовании запроса 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.
}
});