Har*_*M V 26
来自IRC的Savant帮助了我,他建议在beforeRender(){}app_controller 中使用
// Before Render
function beforeRender() {
if($this->name == 'CakeError') {
//$this->layout = 'error';
}
}
Run Code Online (Sandbox Code Playgroud)
CakeError是一个错误的catchAll:D
exp*_*ora 15
在CakePHP 2.2.2中,我用自己的方式更改了core.php中的ExceptionRenderer,如下所示:
应用程序/配置/ core.php文件:
Configure::write('Exception', array(
'handler' => 'ErrorHandler::handleException',
'renderer' => 'MyExceptionRenderer', // this is ExceptionRenderer by default
'log' => true
));
Run Code Online (Sandbox Code Playgroud)
应用程序/库/错误/ MyExceptionRenderer.php:
App::uses('ExceptionRenderer', 'Error');
class MyExceptionRenderer extends ExceptionRenderer {
protected function _outputMessage($template) {
$this->controller->layout = 'error';
parent::_outputMessage($template);
}
}
Run Code Online (Sandbox Code Playgroud)
pti*_*ica 11
最好在app文件夹中创建一个error.php文件
class AppError extends ErrorHandler {
function error404($params) {
$this->controller->layout = 'error';
parent::error404($params);
}
}
Run Code Online (Sandbox Code Playgroud)
所以你可以避免在savants的解决方案引入的每个页面渲染中进行if-testing
Yas*_*eja 11
只需要在/app/View/Errors/error400.ctp下的error400.ctp文件中进行布局更改
打开该文件并设置布局
<?php $this->layout=''; //set your layout here ?>
Run Code Online (Sandbox Code Playgroud)
我对CakePHP 2.3的解决方案
更改core.php中的ExceptionRenderer以使用您自己的渲染器.
应用程序/配置/ core.php文件:
Configure::write('Exception', array(
'handler' => 'ErrorHandler::handleException',
'renderer' => 'MyExceptionRenderer',
'log' => true
));
Run Code Online (Sandbox Code Playgroud)
应用程序/库/错误/ MyExceptionRenderer.php:
App::uses('ExceptionRenderer', 'Error');
class MyExceptionRenderer extends ExceptionRenderer
{
/**
* Overrided, to always use a bare controller.
*
* @param Exception $exception The exception to get a controller for.
* @return Controller
*/
protected function _getController($exception) {
if (!$request = Router::getRequest(true)) {
$request = new CakeRequest();
}
$response = new CakeResponse(array('charset' => Configure::read('App.encoding')));
$controller = new Controller($request, $response);
$controller->viewPath = 'Errors';
$controller->layout = 'error';
return $controller;
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法的优点是它确保从AppController抛出的任何异常在呈现异常时不会导致无限循环.每次都强制执行异常消息的基本呈现.