使用异常的CakePHP 2.0+自定义错误视图

时间:2012-05-31 21:29:40

标签: php cakephp

我在这里一直在阅读以下问题:CakePHP 2.0 - How to make custom error pages?

关于在CakePHP 2.0+中为异常处理创建自定义视图,并一直使用它作为基础在我自己的应用程序中开始做同样的事情,因此开始我自己的问题。

但是我没有遵循逻辑。例如,Throw NotFoundException如何知道在错误控制器中调用notFound方法,因为我没有看到任何关于命名的直接关系...除非我错过了这一点?

在任何情况下,我都希望添加404,403和401错误,然后能够创建自定义视图并在整个应用程序中使用异常处理程序调用它们。

任何人都可以对此有所了解吗?我正在使用最新版本的Cake 2.1

所以我有以下代码:

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

    class AppExceptionRenderer extends ExceptionRenderer {

        public function notFound($error) {
            $this->controller->redirect(array('controller' => 'errors', 'action' => 'error404'));
        }
}

我想用渲染自定义错误视图来替换该重定向:

我试过了:

$this->controller->layout = null;
$this->controller->render('/Errors/error404');

但是这只是显示一个空白页面...任何人都可以帮助我,因为我不想进行重定向,而是更愿意遵循约定并在获取错误时使用相同的URL呈现实际视图。

更新:还注意到,只有在控制器中手动调用异常时才会调用自定义视图,而不是实际错误,例如domain.com/garbageurl或其他内容...所以它似乎没有做我的想法!

2 个答案:

答案 0 :(得分:1)

从核心Cake看看这些文件:

以下是发生的事情:

  • ErrorHandler::handleException()是您的exception handler。抛出异常时会调用它。
  • ErrorHandler::handleException()调用ExceptionRenderer::__construct()(您的自定义异常呈现器必须扩展ExceptionRenderer),它会解析抛出的异常的名称,并从中设置$this->method。< / LI>
  • ErrorHandler::handleException()然后调用使用call_user_func_array()ExceptionRenderer::render()来调用名称为$this->method的方法。

答案 1 :(得分:0)

我只是在寻找相同的东西, 可以使用AppExceptionRenderer找到一个简洁的方法来做到这一点。它只是不允许你有单独的error403和error404模板文件。

所以我只是在我的/app/View/Errors/error400.ctp文件中执行此操作而不是......

<? if ($error instanceof ForbiddenException) { ?>

    <h4>Whoops! The page you attempted to access 
        requires permissions that you don't have.</h4>  

<? } else { ?>

    <h4>Whoops! We couldn't find the page you were looking for, sorry!</h4> 

<? } ?>