CakePHP - ErrorHandler没有扩展AppController的问题

时间:2009-08-09 19:41:43

标签: php cakephp frameworks

我一直想知道为什么我的错误页面导致了我网站的某些页面 不要渲染,但后来我意识到这是因为AppError扩展 ErrorHandler而不是AppController。这引起了一些变数 我在AppController的beforeFilter方法中设置不被发送到 风景。因为我无法从AppError访问会话变量,所以 以为我可以通过使用classRegistry来逃脱 实例化可以简单地复制和粘贴的东西 来自AppController的beforeFilter的其余代码......但是这不起作用,它看起来也不是一个非常优雅的修复。谁有任何关于什么的线索 这是解决这个问题的最好方法吗?谢谢,大卫。

2 个答案:

答案 0 :(得分:6)

您的AppError类有一个控制器实例。您可以手动调用beforeFilter:

<?php
class AppError extends ErrorHandler {
  function error404() {
    $this->controller->beforeFilter();
    parent::error404();
  }
}
?>

答案 1 :(得分:1)

在CakePHP 2中,你可以做这样的事情来达到同样的效果。在app/Config/bootstrap.php中,添加以下行:

Configure::write('Exception.renderer', 'AppExceptionRenderer');

然后使用以下代码创建文件app/Lib/Error/AppExceptionRenderer.php

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

class AppExceptionRenderer extends ExceptionRenderer {
    protected function _outputMessage($template) {
        $this->controller->beforeFilter();
        $this->controller->render($template);
        $this->controller->afterFilter();
        $this->controller->response->send();
    }
}

此处更详细地描述:http://book.cakephp.org/2.0/en/development/exceptions.html#using-a-custom-renderer-with-exception-renderer-to-handle-application-exceptions

修改:更新了指向2012年7月5日起正确定位CakePHP 2.0图书的链接。