2017-09-05 1 views
1

J'ai cette partie de code dans le contrôleur, mais quand je fais cette action et SI fonctionne très bien et le message d'erreur apparaît dans le journal de la console.Throw exception, mais réponse json obtenir le statut SUCCESS

Mais il semble que 'succès' a un statut vrai. Et il ne devrait pas

Try { 
    if ($last['date']) { 
     if ($last['date']->format('d-m-Y') == $par['date']) { 
       throw new \Exception('error', 500); 
      } 
    } 

    return new JsonResponse([ 
     'success' => true, 
     'data' => $content, 
     'message' => 'success' 
    ]); 
} catch (\Exception $exception) { 

    return new JsonResponse([ 
     'success' => false, 
     'code' => $exception->getCode(), 
     'message' => $exception->getMessage(), 
    ]); 
} 

JQuery

$.ajax({ 
    type: "POST", 
    url: "/app/url", 
    data: TableData, 
    dataType: "json", 
    success: function(response){ 
     console.log(response.message); 
     $('#message').html('<p class="alert alert-success">' + response.message + '</p>'); 
    }, 
    error: function (response) { 
     console.log(response.message); 
     $('#message').html('<p class="alert alert-danger">' + response.message + '</p>'); 
    } 
}); 
+2

Pour signaler une erreur, vous devez renvoyer une réponse HTTP dans la plage 400 ou 500. Dans votre implémentation actuelle, vous avez fait une demande avec une réponse réussie. Cette réponse contient un morceau de Json qui arrive à avoir une propriété 'succès' avec la valeur' false', mais votre appel Ajax ne sait pas que cela indique une erreur. Vous pourriez implémenter cela en JavaScript en analysant la réponse, mais le mieux et le plus «pur» serait de faire en sorte que PHP renvoie un code de réponse d'erreur correct. Voir [Codes d'état HTTP] (https://en.wikipedia.org/wiki/List_of_HTTP_status_codes) – GolezTrol

+0

Mais ne devrait pas bloquer le travail quand je jette une exception? – Ferror

+0

Ok, donc au lieu de lancer une exception je devrais rétablir la réponse avec succès: false – Ferror

Répondre

1

Votre code AJAX reçoit la réponse en success chaque fois, quel que soit le contenu JSON, parce que vous envoyez toujours une réponse 200 (ce qui est Succès). Pour dire AJAX pour traiter la réponse comme une erreur (et passez à la méthode error au lieu de la méthode success dans votre gestionnaire de réponse AJAX), vous devez envoyer un code d'erreur dans la réponse, à savoir 400, comme ceci:

return new JsonResponse([ 
     'success' => false, 
     'code' => 400, 
     'message' => $exception->getMessage(), 
    ], 400); 

Donc, si vous lancez votre Exception s personnalisé, vous devez définir la propriété code pour chacun en fonction de sa véritable signification HTTP. Maintenant, les gestionnaires success et error dans AJAX ont des paramètres différents. Dans success, le premier paramètre est data, simplement les données renvoyées par le serveur. D'autre part, dans error, le premier paramètre est un objet jqXHR. Pour accéder aux données de cet objet, vous avez une poignée de paramètres différents, mais ce dont vous avez besoin maintenant, puisque vous avez JSON, c'est jqXHR.responseJSON. Donc, maintenant votre message d'erreur sera dans response.responseJSON.message, pas dans response.message. En savoir plus sur ce here.

+0

Pourriez-vous me dire comment je peux obtenir un message d'erreur de jsonRespone avec votre réponse? l'ancienne manière me donne UNDEFINED (mon amour) – Ferror

+1

Vos données dans la méthode 'error' est maintenant dans' response.responseJSON', alors obtenez-le avec 'response.responseJSON.message'. Pour poursuivre le débogage, placez 'console.log (response);' dans le gestionnaire d'erreurs, de sorte que vous puissiez voir tout l'objet de réponse. – ishegg

+0

J'ai édité la réponse pour le mentionner. – ishegg