CakePHPでAPIを実装している時に、以下のようなことを実装したいと思っていました。
■通常画面のエラーページは(404ページや500ページ)ヘッダやフッタなどが表示されているエラーページを表示したい
■APIでの接続はエラーページはJSON形式でエラー情報を戻してあげたい
もともと、通常画面のエラーに関してはerror400.ctpやerror500.ctpを変更して、エラー画面は実装していました。特定のコントローラーだけ別のエラー画面にする方法がなかなかまとまっていなかったので、ここにまとめておきます。
■手順のまとめ
以下の様な手順で対応します。
1.ExceptionRendererを新しく作る
2.Configure::writeを使って、エラー画面を変更したい対象のコントローラーでExceptionの設定を書き換える。1で作ったExceptionRendererを指定します。
■ExceptionRendererを作る
今回は以下のディレクトリに新しくApiExceptionRenderer.phpという名前でファイルを作成しました。
app/Lib/Error/ApiExceptionRenderer.php
ファイルを作成後、以下のようにプログラムを書きました。このApiExceptionRendererを使ってエラーを出力するようにすると、errorApiメソッドの中が実行されるようになっています。errorApiメソッド内はjsonを戻すだけになっています。
<?php
class ApiExceptionRenderer extends ExceptionRenderer {
public function __construct(Exception $exception) {
parent::__construct($exception);
$this->method = 'errorApi';
}
public function errorApi($error) {
$message = $error->getMessage();
$this->controller->response->type('json');
$this->controller->response->statusCode($error->getCode());
$jsonData = [
'message' => 'ApiError',
'http_status' => $error->getCode(),
];
echo json_encode($jsonData);
}
}
■ApiExceptionRendererを使う宣言をする
コントローラー上のbeforeFilterで以下のように記述をすると、ApiExceptionRendererを利用してエラーを出力するようになります。
Configure::write('Exception', array(
'handler' => 'ErrorHandler::handleException',
'renderer' => 'ApiExceptionRenderer',
'log' => true
));
これで、上記の設定を書いたコントローラはすべてjsonでエラー情報が戻るようになります。
APIを実装するときなどに参考にしてみてください。では。