Responder a uma chamada ajax com mensagem json e código de status (CakePHP)

Se você está trabalhando com o CakePHP e construindo um aplicativo de página única (SPA), API REST ou apenas uma solicitação ajax – há casos em que você precisa responder ao cliente que a solicitação foi rejeitada (falha na autenticação, nenhuma ação desse tipo & etc) . Com solicitações regulares, é simples assim:

if (...) {
throw new NotFoundException('Could not find that post');
}

ou apenas use a função setFlash da Sessão. Mas e as chamadas de Ajax? Você deseja responder como código de status HTTP com mensagem? Dessa forma não funcionará. Você precisa definir responder como json, código de status e interromper o aplicativo inteiro:

if( ... ) {
if($this->request->is('ajax')) {
$this
->response->type('json');
$this
->response->statusCode(400);
$this
->response->body(json_encode(
array
('status' => 'ERROR', 'message' => 'Bad Request')));
$this
->response->send();
$this
->_stop();
}
}

A última linha é opcional:

$this->_stop();

Isso interromperá o aplicativo inteiro. Em alguns casos, você precisa, por exemplo, acesso não autorizado:

public function isAuthorized($user) {
if( ... ) {
// Auth fails
if($this->request->is('ajax')) {
$this
->response->type('json');
$this
->response->statusCode(401);
$this
->response->body(json_encode(
array
('status' => 'ERROR', 'message' => 'Unauthorized')));
$this
->response->send();
$this
->_stop();
}
}
}

mas pode haver casos em que você deseja processar seu aplicativo ainda mais sem interrompê-lo.