2013-06-13 13 views
16

Obecnie używam tego, aby wyświetlić błędy sprawdzania poprawności poprzez AJAX:błędy walidacji w trybie 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(); 
      } 

To działa dobrze, robi dokładnie to, czego potrzebuję.

Problemem jest to, co mam zrobić, aby przetransportować błędów z laravel do 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); 
     }  

    } 

Jeśli chcę mieć nazwy pól jak klucz, muszę iteracyjne $ zasady, ale nawet gdybym nie używaj nazw pól jako klucza, ale muszę powtarzać komunikaty o błędach, aby zbudować $ verrors.

Jak mogę przekonwertować $v->messages() na odpowiednik $verrors bez potrzeby powtarzania? Ponieważ Response::json() oczekuje tablicy zamiast obiektu.

Odpowiedz

61

Najprostszym sposobem jest wykorzystanie obiektu walidatora . Można to zrobić tak:

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

To daje odpowiedź JSON tak:

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

To może być głupi komentarz - ale nie ustawienie kod HTTP 400 oznacza odpowiedź JSON jest całkowicie ignorowany? – Beans

+2

Zależy od "klienta" czytającego JSON. jQuery na przykład obsługuje to doskonale. Nie powoduje sukcesu, ale wywołania zwrotnego błędu, które jest tym, czego potrzebujesz. – DerLola

+1

Korzystając z jQuery, możesz uzyskać błędy za pomocą tego kodu w żądaniu ajax: 'error: function (xhr, status, data) { console.log (xhr.responseJSON.errors); } ' – Yako

8

W ajax odpowiedzi próbuje coś

.fail(function(data) { 
     var response = JSON.parse(data.responseText); 
     var errorString = '<ul>'; 
     $.each(response.errors, function(key, value) { 
      errorString += '<li>' + value + '</li>'; 
     }); 
     errorString += '</ul>'; 
1

używam laravel 5.1 przy okazji, ale myślę, że podstawy tego powinny dotyczyć innych wersji. Laravel automatycznie odsyła odpowiedź o błędzie walidacji. Można po prostu wykonaj następujące czynności w kontrolerze:

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

Następnie w javascript (używam jQuery tutaj):

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

Jeśli spojrzeć na wyjściu na konsoli będziesz wkrótce zobaczysz, jak odebrać wszystko, co chcesz, z odpowiedzi odesłanej przez Laravel. W tej odpowiedzi komunikaty o błędach są w jsonie jako pary klucz-wartość, gdzie klucz jest nazwą pola, dla którego nie sprawdzono poprawności, w moim przykładzie "e-mail". Pamiętaj, aby upewnić się, że trasa ajax jest ustawiona w pliku routes.php, a metoda (get/post) pasuje do tego w javascript.

1

Istnieje lepszy sposób na obsługę błędów sprawdzania poprawności podczas korzystania z żądania Ajax.

Utwórz klasę wniosek, jak zwykle, na przykład UploadFileAjaxRequest:

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

Użyj go w metodzie kontrolera:

public function uploadFileAjax(UploadFileAjaxRequest $request) 

Jeśli istnieje jakikolwiek błąd, zwróci tablicę błędów, które można użyć w JS:

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

Lara vel 5 zwraca błąd walidacji automatycznie

na które po prostu trzeba zrobić następujące rzeczy,

Kontroler:

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

Widok:

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

można zbudować dla każdego pola validation jeden znacznik <span> z identyfikatorem jako nazwą pola i sufiksem _error, co spowoduje wyświetlenie błędu sprawdzania poprawności z ab Ove logika jak następujące,

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

Nadzieja to pomaga :)

+0

dziękuję za to. spróbuję później. –

Powiązane problemy