2010-10-10 33 views

回答

26

从IRC莎凡特帮了我和他在app_controller使用beforeRender(){}建议

// Before Render 
function beforeRender() { 
    if($this->name == 'CakeError') { 
     //$this->layout = 'error'; 
    } 
} 

CakeError是错误的统称:d

+0

这种方法不再使用CakePHP 2.x的有效我不知道现在该怎么做......大声笑 – 2012-06-29 19:15:01

+3

我可以证实这种方法适用于Cake 2.2.1。 – bancer 2012-09-13 09:14:33

+0

我没有在Cake 2.2.1中确认。我调试了beforeRender中的$ this-> layout,我得到了预期的'public_layout',但它仍然以default.ctp呈现。 DEBUG被设置为0. – 2012-10-23 11:20:04

4

我知道这个简单的方法是在你的AppController创建这个函数:但是

function appError($method, $messages) 
{ 
} 

那么你可以做任何你想要的错误,显示它你喜欢,或不显示它在所有,发送电子邮件等。(我不知道这方法,如果仍然有效。)

也有在您的应用程序根创建app_error.php的选项,在它class AppError extends ErrorHandler,它使您能够覆盖各种错误。但我还没有这样做,所以我不能告诉你更多关于它的信息。

请参阅cake/libs/error.phpcake/libs/object.php,当然还有The Book了解更多信息。忘记提及,一旦你发现错误,没有什么能够阻止你 - 例如 - 将错误存储在会话中,重定向到你的“错误处理控制器”,然后显示在你的控制器中你要。

+0

感谢很多文件,并设置布局:d – 2010-10-10 13:04:00

10

更好地在您的应用程序创建一个error.php文件文件夹

class AppError extends ErrorHandler { 
    function error404($params) { 
      $this->controller->layout = 'error'; 
      parent::error404($params); 
    } 
} 

这样就可以避免在每个页面如果测试渲染学者解决方案引入了

14

在CakePHP 2.2.2,我改变了ExceptionRenderer在core.php中与我自己的,就像这样:

应用程序/配置/ core.php中:

Configure::write('Exception', array(
    'handler' => 'ErrorHandler::handleException', 
    'renderer' => 'MyExceptionRenderer', // this is ExceptionRenderer by default 
    'log' => true 
)); 

应用程序/库/错误/ MyExceptionRenderer。 PHP:

App::uses('ExceptionRenderer', 'Error'); 

class MyExceptionRenderer extends ExceptionRenderer { 

    protected function _outputMessage($template) { 
    $this->controller->layout = 'error'; 
    parent::_outputMessage($template); 
    } 

} 
+0

无法满足这个要求,它胜过了我复制每个错误视图并将布局设置为顶部“错误”的旧方法。 – Matthew 2014-03-08 13:31:29

4

我的解决方案为CakePHP的2.3

变化率T他core.php中的ExceptionRenderer使用您自己的渲染器。

应用程序/配置/ core.php中:

Configure::write('Exception', array(
    'handler' => 'ErrorHandler::handleException', 
    'renderer' => 'MyExceptionRenderer', 
    'log' => true 
)); 

应用程序/库/错误/ 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; 
    } 
} 

这种方法的优点是,它保证了从AppController中抛出的异常渲染异常时不会导致无限循环。每次强制执行异常消息的基本呈现。

9

只需要在/app/View/Errors/error400下的error400.ctp文件中进行布局更改即可。CTP

打开,通过

<?php $this->layout=''; //set your layout here ?> 
+0

+ +1为一个非常简单的解决方案。工作一种享受,几乎没有任何努力! (CakePHP 2.4.7) – Hatcham 2014-10-12 23:20:45

+0

这是正确的解决方案。谢谢 – Alireza 2016-05-04 13:05:44