CakePHPのデフォルトエラー表示を独自版にするべく、例外ハンドリングを設定してカスタマイズする

CakePHPでは、存在しないメソッドや処理を実行すると(存在しないURLでアクセスされると)、CakePHP独自のエラー画面が表示される。これはデバッグレベルを変更しても変わらない場合がある。
そこで画面表示を独自のものに変更するための方法として、例外ハンドリングという方法がある。
CakePHPではエラー処理を細かく設定できるが手順がかなり複雑(「○○一発」ではないということ)だったりする。方法もいくつかあるようだが、私が実装をする際に取ったのは例外ハンドリングの設定だ。これも「設定ファイル一発」ではなく、ある程度の調整が必要となる。

(1) core.php設定ファイルの設定
(2) 例外ハンドラ用レンダラの作成
(3) Controllerの作成
(4) View・Layoutsの作成

以下、順に解説してみたい。

(1) core.php設定ファイルの設定

app/Config/core.phpファイルにある「Exception」設定のうち、描画に関する設定「renderer」を独自のクラスに設定する。
ここでレンダラに「MyExceptionRenderer」を指定しているが、これは(2)で作成するレンダラファイルMyExceptionRenderer.phpで宣言するMyExceptionRendererクラスを指す。

[php]
Configure::write(‘Exception’, array(
‘handler’ => ‘ErrorHandler::handleException’,
//’renderer’ => ‘ExceptionRenderer’, /*** デバッグ中はこっちを有効にして以下をコメントアウトするとデバッグしやすい ***/
‘renderer’ => ‘MyExceptionRenderer’, /*** こちらが実装したいレンダラ ***/
‘log’ => true
));
[/php]

(2) 例外ハンドラ用レンダラの作成

app/Libディレクトリ内にErrorディレクトリを作成し、そのディレクトリ内にMyExceptionRenderer.phpファイルを作成する。

[shell]
cd app/Lib
mkdir Error
cd Error
vi MyExceptionRenderer.php
[/shell]

エディタを使って独自のMyExceptionRendererクラスを実装していく。
MyExceptionRendererクラスには例外ごとにメソッドを用意し、そのメソッドに例外時に処理したい内容を書いていく。MyExceptionRedererクラス内の各メソッドは、CakePHP内蔵の例外の名前をベースにして作られていて規則性がある。
内蔵の例外処理名一覧は以下のマニュアルに記載がある。ここから必要な例外処理名を参考に例外時のレンダラをハンドリングすることができる。

■Built in Exceptions for CakePHP (CakePHP2.0マニュアル・英語版)
http://book.cakephp.org/2.0/en/development/exceptions.html#built-in-exceptions-for-cakephp

私の実装では以下のように代表的なエラー処理をErrorsコントローラーのerror404アクションにリダイレクトしている。必要に応じて実装をするとよい。

[php]
<?php
App::uses(‘ExceptionRenderer’, ‘Error’);

class MyExceptionRenderer extends ExceptionRenderer {
public function notFound($error) {
$this->controller->redirect(array(‘controller’ => ‘errors’, ‘action’ => ‘error404’));
}
public function missingController($error) {
$this->controller->redirect(array(‘controller’ => ‘errors’, ‘action’ => ‘error404’));
}
public function missingAction($error) {
$this->controller->redirect(array(‘controller’ => ‘errors’, ‘action’ => ‘error404’));
}
public function missingWidget($error) {
$this->controller->redirect(array(‘controller’ => ‘errors’, ‘action’ => ‘error404’));
}
}
?>
[/php]

(3) Controllerの作成

エラーをハンドリングするためのコントローラークラスをapp/Controller/ErrorsController.phpファイルとして作成する。ここではerror404アクションだけを指定している。

■app/Controller/ErrorsController.php
[php]
< ?php
class ErrorsController extends AppController {
private $footer_for_layout = "Copyright 2012 All Rights Reserved.";
public $name = ‘Errors’;
public function error404() {
$this->layout = ‘Errors/error404’;
$this->set("footer_for_layout", $this->footer_for_layout);
}
}
?>
[/php]

(4) View・Layoutsの作成

ErrorsControllerクラス用のViewとLayoutsを作成する。これは他のViewやLayoutと同様にHTMLをベースとして普通のCakePHPのctpファイルとして記述できる。

■Viewファイルの例 (app/View/Errors/error404.ctp)
[php]
<h2>404 Error – Page Not Found</h2>
[/php]

■Layoutsファイルの例 (app/Layouts/Errors/error404.ctp)
[php]
<html>
<body>
< ?php echo $content_for_layout; ?>
< ?php echo $footer_for_layout; ?>
</body>
</html>
[/php]

[Sponsored Link]


オープンソース徹底活用 CakePHP 2.1によるWebアプリケーション開発WebデザイナーのためのCakePHPビューコーディング入門CakePHP2 実践入門 (WEB+DB PRESS plus)詳解CakePHP辞典―2.0/2.1/2.2/2.3対応FuelPHP入門小岩井 純水りんご 1.5L×8本

“CakePHPのデフォルトエラー表示を独自版にするべく、例外ハンドリングを設定してカスタマイズする” への1件の返信

コメントを残す

メールアドレスが公開されることはありません。