CakePHPでコントローラーごとにエラーページを変更する

   

CakePHPでコントローラーごとにエラーページを変更する

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を実装するときなどに参考にしてみてください。では。

megane

megane

エンジニア歴13年位です。PHPとかMysqlを使ってWebシステムを構築します。 Javaも書きます。 CakePHPも使います。 サーバのチューニングもごりごりやります。 あと、お肉と自動車が好きです。Twitterとか申請どうぞ。

 - CakePHP ,