【问题标题】:Custom views for errors in CakePHP 2.1CakePHP 2.1 中错误的自定义视图
【发布时间】:2012-06-02 16:23:40
【问题描述】:

我希望为 CakePHP 2.1 中的错误创建自定义视图

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

但是有些东西不能按预期工作!

1.) 异常和错误似乎不是一回事,就好像我去一个虚假的 url 我得到了内置的 404 页面但是如果我在控制器中手动执行一个未找到的异常,它将调用自定义视图... 为什么是这样?我认为 Cake 中的所有错误都经过了异常处理?

2.) 我正在尝试渲染视图而不是实际重定向用户... 比如:

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');

但我最终得到的只是一个空白页...这是为什么呢?而且这只发生在手动异常时?

谁能回答这两个问题?谢谢

【问题讨论】:

  • 空白页?有PHP错误吗?你运行 mod_security 吗?
  • 蛋糕或PHP日志文件中是否有任何内容?
  • 不,但是为什么伪造的 url 404 与未找到的异常不同?有人调用自定义视图,有人不调用!
  • 这有什么更新吗???肯定有人知道如何在 Cake 2.1 中使用 ExceptionHandler 吗?
  • 我会在 IRC 中问:freenode.cakephp

标签: php cakephp


【解决方案1】:

我终于想通了!查看来自github 的代码,我设法让它工作。这是我的 AppExceptionRenderer.php:

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

class AppExceptionRenderer extends ExceptionRenderer {
    public function missingController($error) {
        $this->controller->render('/Errors/error404', 'layout');
        $this->controller->response->send();
    }

    public function missingAction($error) {
        $this->missingController($error);
    }
}

如果你想调用你的控制器回调,你必须在 beforeFilter() 之前做这样的事情:

$this->controller->beforeFilter();

$this->controller->response->send();线是踢球者。希望这对你有用!

【讨论】:

  • 完成并完成:hoffsays.com/2012/06/12/…
  • 似乎我遇到的问题是因为在 Cake 术语中,即使在生产环境中,它也会区分 notFound 和 missingController 异常。在您的博客文章中可能值得一提,因为它给我带来了问题!您是否还有可以放入 AppExceptionRenderer 的所有可能方法的列表?干杯
  • 都是在 Cake 网站上找到的,所以我在这里添加了所有的异常:bin.cakephp.org/view/513097378 使其能够处理生产环境中所有可能出现的错误!
  • 嗯,是的,这很奇怪——我对 notFound 方法没有任何运气,但出于某种原因,missingController 和 missingAction 方法为我做了。您介意我将您的 pastebin 中的代码添加到我的帖子中吗?我假设你现在已经设法让它工作了?如果它是为你做的,你介意在答案上点击接受吗? :)
  • 这并不奇怪,它实际上是有道理的,因为 notFound 与缺少的控制器或视图不同,所以它们被视为单独的错误很好。
【解决方案2】:

这很简单,

public function notFound($error) {
    $this->_outputMessage('error404');
}

这就是你需要做的所有事情

【讨论】:

    【解决方案3】:

    简单地说:

    throw new NotFoundException;
    

    请参阅文档中有关“内置异常”的example code

    App::uses('ExceptionRenderer', 'Error'); 不应该是必需的。

    对于单个视图,请编辑 View/Errors/error400.ctp

    【讨论】:

    • 是的,它调用了 404 错误,这就是我在上面发布的内容。但我的问题是,这调用了自定义的东西,但一个虚假的 url 并没有调用自定义的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2012-08-08
    • 2014-06-08
    相关资源
    最近更新 更多