【问题标题】:CakePHP 2.0+ custom error views using exceptionsCakePHP 2.0+ 使用异常的自定义错误视图
【发布时间】:2012-05-31 21:29:40
【问题描述】:

我一直在这里阅读以下问题: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 或其他错误等实际错误...所以它没有似乎没有按照我的想法做!

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

    看看 core Cake 的这些文件:

    这是发生了什么:

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

    【讨论】:

    • 这让我更加困惑 :( 所以简单来说,NotFoundException 是如何知道调用 notFound 方法的,因为没有人通过名字互相调用......
    • 另外,我不确定将用户重定向到错误页面是否正确,不应该在实际位置呈现错误页面吗?
    • 它知道$method = $template = Inflector::variable(str_replace('Exception', '', get_class($exception)));ExceptionRenderer中使用哪个方法:github.com/cakephp/cakephp/blob/master/lib/Cake/Error/…它基于抛出的异常类的名称。
    • @Cameron ErrorHandler::handleException() 是你的exception handler。它在抛出异常时被调用。我更新了我的回答。
    • 这不是“重定向”。它只是根据您的异常渲染器的功能使用自定义控制器操作和视图。 URL 不会改变。
    【解决方案2】:

    我只是在寻找同样的东西,没有可以使用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> 
    
    <? } ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多