Ошибки проверки в режиме AJAX - программирование
Подтвердить что ты не робот

Ошибки проверки в режиме 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() ожидает массив вместо объекта.

4b9b3361

Ответ 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.
    }
});