2012-10-02 9 views
24

¿Existe una manera limpia y fácil de lanzar excepciones php a través de una llamada jquery de respuesta jquery/ajax?Manera limpia de lanzar una excepción php a través de jquery/ajax y json

+1

¿Por qué quiere lanzar una excepción? Es probable que sea mejor devolver un estado de error que no desencadene una excepción. – doublesharp

+2

Quiero decir que he intentado captar en el lado del servidor, y quiero poner el mensaje de error en la respuesta JSON. – madphp

Respuesta

44

Se podría hacer algo como esto en PHP (suponiendo que esto se llama a través de AJAX):

<?php 

try { 
    if (some_bad_condition) { 
     throw new Exception('Test error', 123); 
    } 
    echo json_encode(array(
     'result' => 'vanilla!', 
    )); 
} catch (Exception $e) { 
    echo json_encode(array(
     'error' => array(
      'msg' => $e->getMessage(), 
      'code' => $e->getCode(), 
     ), 
    )); 
} 

En JavaScript:

$.ajax({ 
    // ... 
    success: function(data) { 
     if (data.error) { 
      // handle the error 
      throw data.error.msg; 
     } 
     alert(data.result); 
    } 
}); 

También puede desencadenar el manejador de error: $ .ajax () al devolver un encabezado de 400 (por ejemplo):

header('HTTP/1.0 400 Bad error'); 

O use Status: si estás en FastCGI. Tenga en cuenta que el controlador error: no recibe los detalles del error; para lograr eso, tiene que anular el funcionamiento de $.ajax() :)

+0

Gracias. ¿Hay alguna forma de activar la devolución de llamada de jquery ajax? – madphp

+0

@madphp Sí, simplemente devuelva el código http 400 usando el encabezado() –

+0

Y para PHP> = 5.4 puede usar 'http_response_code (400);' – PhoneixS

6

Facebook hacer algo en su SDK PHP donde lanzan una excepción si falla una solicitud HTTP por cualquier razón. Se podría adoptar este enfoque, y simplemente devolver el error y excepción detalles si se produce una excepción:

<?php 

header('Content-Type: application/json'); 

try { 
    // something; result successful 
    echo json_encode(array(
     'results' => $results 
    )); 
} 
catch (Exception $e) { 
    echo json_encode(array(
     'error' => array(
      'code' => $e->getCode(), 
      'message' => $e->getMessage() 
     ) 
    )); 
} 

continuación, puede simplemente escuchar la tecla error en su llamadas Ajax en JavaScript:

<script> 
    $.getJSON('http://example.com/some_endpoint.php', function(response) { 
     if (response.error) { 
      // an error occurred 
     } 
     else { 
      $.each(response.results, function(i, result) { 
       // do something with each result 
      }); 
     } 
    }); 
</script> 
4

Si todos los errores se deben tratar de la misma manera (mostrando un cuadro de diálogo, por ejemplo). Puede hacerlo de esta manera:

PHP Fin:

public function throwJsonException($msg) { 
    echo json_encode(array('error'=> true, 'msg' => $msg)); 
} 

throwJsonException('login invalid!'); 

jQuery Fin:

$(document).ajaxSuccess(function(evt, request, settings){ 
    var data=request.responseText; 
    if (data.length>0) { 
     var resp=$.parseJSON(data); 
     if (resp.error) 
     { 
      showDialog(resp.msg); 
      return; 
     }     
    }  
}); 
0

Como complemento a las respuestas anteriores, en vez de repetir el mismo código para JSON codificación en todas sus excepciones, puede configurar un manejador de excepciones para que se use solo en los scripts necesarios. Por ejemplo:

function ajaxExceptionHandler($e) { 
    echo json_encode(array(
     'error' => array(
     'code' => $e->getCode(), 
     'msg' => $e->getMessage()) 
    )); 
} 

Luego, en el controlador de ajax,

set_exception_handler('ajaxExceptionHandler'); 
Cuestiones relacionadas