AppErrorクラスは後方互換性のためのものであり、代わりに例外を使用する必要があることを読みました。 404エラーや完全にカスタムエラーなどのカスタムエラーページを作成するにはどうすればよいですか?
これを試して:
/app/Config/core.php
例外レンダリングはAppExceptionRender
として設定する必要があります。例:
_Configure::write('Exception', array(
'handler' => 'ErrorHandler::handleException',
'renderer' => 'AppExceptionRenderer',
'log' => true
));
_
/app/Controller/ErrorsController.php
_class ErrorsController extends AppController {
public $name = 'Errors';
public function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('error404');
}
public function error404() {
//$this->layout = 'default';
}
}
_
/app/Lib/Error/AppExceptionRenderer.php
_App::uses('ExceptionRenderer', 'Error');
class AppExceptionRenderer extends ExceptionRenderer {
public function notFound($error) {
$this->controller->redirect(array('controller' => 'errors', 'action' => 'error404'));
}
}
_
/app/View/Errors/error404.ctp
_<div class="inner404">
<h2>404 Error - Page Not Found</h2>
</div>
_
必要な場所に挿入します:throw new NotFoundException();
404エラーページのコンテンツをカスタマイズし、カスタムロジックを必要としないようにするには、app/View/Errors/error400.ctp
のコンテンツを編集します。
これはどこでも適切に文書化されていないようです。
デフォルトの代わりに別のレイアウトを使用する場合のみの場合、単に$this->layout = 'your_error_layout';
をerror400.ctp内(または[表示/エラー]で作成した他のエラーページ)に挿入します。
404などの名前のレイアウトを作成し、アプリコントローラーで使用します
function _setErrorLayout() {
if ($this->name == 'CakeError') {
$this->layout = '404';
}
}
function beforeRender () {
$this->_setErrorLayout();
}
ブラウザのURLをhttp://example.com.br/error/error404
にリダイレクトし、ユーザーが入力したページをたどってこのエラーを生成することはできないため、受け入れられた回答は最良の選択肢ではありません。
この状況を処理するより良い方法は、View/Errors/error400.ctp
のファイルを編集することです。したがって、http:example.com/crazy-wrong-url
のような見つからないURLを入力すると、ブラウザーはこのURLを保持しますが、error400.ctp
編集すること。
ビューがレンダリングされるレイアウトを変更する場合は、ビューにこれを入力します<?php $this->layout = 'error'; ?>
表示するエラーのCustomErrorPages
を作成するだけで、Exeptions
またはclass
を作成できます。このクラスはCakeExeption
を拡張する必要があります。次に、exeptionlogicとセットを構築します。これで、throw new <YourExeptionClass>()
だけを実行でき、エラーが表示されます。
ドキュメント: CakeExceptions
今日、$error->getCode()
(少なくともCakePHP 2.xで)を使用してctpファイルに例外コードを取得できることを発見しました。
$error
は、Cakeが例外オブジェクトを配置したものです...
これで、この値に基づいて、if/else
条件ブロックを使用してビューのコンテンツを変更できるようになります。