Ho anche faticato con le eccezioni personalizzate e i codici di errore quando si utilizzava richieste ajax (jquery mobile nel mio caso). Ecco la soluzione che ho trovato, senza coinvolgere la sovrascrittura della modalità di debug. Genera errori personalizzati nella modalità di sviluppo e anche in modalità di produzione. Spero che aiuta qualcuno:
AppExceptionRenderer.php:
<?php
App::uses('ExceptionRenderer', 'Error');
class AppExceptionRenderer extends ExceptionRenderer
{
public function test($error)
{
$this->_sendAjaxError($error);
}
private function _sendAjaxError($error)
{
//only allow ajax requests and only send response if debug is on
if ($this->controller->request->is('ajax') && Configure::read('debug') > 0)
{
$this->controller->response->statusCode(500);
$response['errorCode'] = $error->getCode();
$response['errorMessage'] = $error->getMessage();
$this->controller->set(compact('response'));
$this->controller->layout = false;
$this->_outputMessage('errorjson');
}
}
}
Puoi lasciare fuori Configure::read('debug') > 0
se si desidera visualizzare l'eccezione in modalità debug. La vista errorjson.ctp si trova in 'Error/errorjson.ctp ':
<?php
echo json_encode($response);
?>
In questo caso la mia eccezione si chiama
TestException
ed è definito come segue:
<?php
class TestException extends CakeException {
protected $_messageTemplate = 'Seems that %s is missing.';
public function __construct($message = null, $code = 2) {
if (empty($message)) {
$message = 'My custom exception.';
}
parent::__construct($message, $code);
}
}
dove ho un codice di errore personalizzato 2, $code = 2
, per la mia risposta JSON. La risposta ajax lancerà un errore 500 con i seguenti dati JSON:
{"errorCode":"2","errorMessage":"My custom exception."}
Ovviamente, è anche necessario generare l'eccezione dal vostro controller:
throw new TestException();
e includere il renderer eccezione http://book.cakephp.org/2.0/en/development/exceptions.html#using-a-custom-renderer-with-exception-renderer-to-handle-application-exceptions
Questo può essere un po 'fuori portata, ma per gestire la risposta all'errore ajax in JQuery io uso:
$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
//deal with my json error
});
Anche se questo non era la risposta che speravo perché involes essere in modalità debug, ti segnalo come corretta dal momento che nessun altro sembra avere qualche idea su questo. Grazie per lo sforzo! –