アプリケーションにおいて、修復不可能なエラーが発生した場合、処理を停止し、ユーザへエラーメッセージを表示することが一般的です。それぞれのコントローラとコンポーネントにおいて、独自のハンドリングを作成する手間を省くため、あらかじめ提供されているメソッドを使用することができます。
$this->cakeError(string $errorType [, array $parameters]);
このメソッドを呼び出すと、ユーザへエラーページが表示され、アプリケーションのこれより後のあらゆる処理が停止されます。
parameters
は、文字列型のみを含む配列でなければなりません。もし配列の中にオブジェクト(例外クラスも含みます)があった場合、文字列型へ変換されます。
CakePHP はエラータイプのセットをあらかじめ定義していますが、コードを書くにあたって、ほとんどのエラータイプはフレームワークそのものにおいてのみ便利です。アプリケーションの開発者にとって、最も使い勝手の良いものは、古き良き 404 エラーでしょう。これは、次のように引数無しで呼び出すことができます:
$this->cakeError('error404');
また他に、 url
パラメータを渡すことで、ある特別な URL
で発生したエラーであることを報告するためのページを表示することができます:
$this->cakeError('error404', array('url' => 'some/other.url'));
独自のエラータイプを使うためにエラーハンドラを拡張すると、より便利になってきます。独自のエラーハンドラは、コントローラのアクションによく似ています。例によって、ビューで変数が利用できるようにするため
set() で渡し、app/views/errors
ディレクトリのビューファイルを出力します。
app/app_error.php
に次のように定義をおこなったファイルを作成してください。
<?php
class AppError extends ErrorHandler {
}
?>
新しいエラータイプのハンドラは、このクラスにメソッドを追加することで実行可能になります。エラータイプとして使いたい名前のメソッドを、ただ単純に作成します。
いくつかのファイルをディスクに書き込むアプリケーションがあるとしましょう。書き込みエラーが発生したら、ユーザにそれを通知することが適切です。これらのコードを、アプリケーションのあちこちに追加することは望ましくありませんので、このケースは新しいエラータイプを使用することが望ましいケースです。
AppError
クラスに新しいメソッドを追加してください。書き込みに失敗したファイルのパスを表す
file
というパラメータを使ってみましょう。
function cannotWriteFile($params) {
$this->controller->set('file', $params['file']);
$this->_outputMessage('cannot_write_file');
}
app/views/errors/cannot_write_file.ctp
にビューを作成します。
<h2>ファイルを読み込めません。</h2>
<p>ディスクから <?php echo $file ?> が読み込めませんでした。</p>
次に controller/component へエラーを投げます。
$this->cakeError('cannotWriteFile', array('file'=>'somefilename'));
$this->_outputMessage(<view-filename>)
のデフォルトの動作は、
views/errors/<view-filename>.ctp
を、ただ表示するだけです。この振る舞いを上書きするには、 AppError
クラスで _outputMessage($template)
を再定義します。