Mam również borykałem się z niestandardowymi wyjątkami i kodami błędów przy korzystaniu z zapytań ajax (jquery mobile w moim przypadku). Oto rozwiązanie, które wymyśliłem, bez konieczności nadpisywania trybu debugowania. Zgłasza błędy niestandardowe w trybie programowania, a także opcjonalnie w trybie produkcyjnym. Mam nadzieję, że ktoś pomaga:
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');
}
}
}
można pominąć Configure::read('debug') > 0
jeśli chcesz wyświetlić wyjątek w trybie debugowania. Widok errorjson.ctp znajduje się w "Error/errorjson.CTP ":
<?php
echo json_encode($response);
?>
W tym przypadku moja Wyjątkiem jest nazywany
TestException
i jest zdefiniowany następująco:
<?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);
}
}
Gdzie mam niestandardowy kod błędu 2, $code = 2
, dla mojej odpowiedzi jsona. Odpowiedź ajax rzuci błąd 500 z następującymi danymi json:
{"errorCode":"2","errorMessage":"My custom exception."}
Oczywiście, trzeba także wyrzucić wyjątek od kontrolera:
throw new TestException();
i obejmują mechanizm renderujący wyjątku http://book.cakephp.org/2.0/en/development/exceptions.html#using-a-custom-renderer-with-exception-renderer-to-handle-application-exceptions
Może to być nieco poza zakresem, ale aby obsłużyć odpowiedź błędu ajax w JQuery używam:
$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
//deal with my json error
});
Mimo że nie była to odpowiedź, na którą liczyłem, ponieważ wywoła ona tryb debugowania, oznaczy to jako poprawną, ponieważ nikt inny nie wydaje się mieć żadnych pomysłów na ten temat. Dzięki za wysiłek! –