CakePHP 2.0中的错误处理。逃脱的viewVars

时间:2011-12-20 21:57:42

标签: cakephp error-handling cakephp-2.0

我在Cake 2中遇到了一个奇怪的问题,我在1.3中从未遇到过错误。

当引发一些异常时(即 NotFoundException ),Cake的错误处理开始了。默认情况下,它实例化 CakeErrorController 并执行所有这些操作(请参阅source)和..转义 viewVars 。但我在我的 AppController beforeRender 中设置了一些视图变量,我不希望它们被转义,因为它们包含html并且它们应该在布局。这种行为的原因是什么?我怎么能告诉Cake不要这样做?

谢谢。

更新

好。我找到了一些解决方案:

我创建了Controller / AppErrorController.php

App::uses('CakeErrorController', 'Controller');

class AppErrorController extends CakeErrorController {
    public function beforeRender() {
        AppController::beforeRender();
    }
}

和Lib /错误/ AppExceptionRenderer.php

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

class AppExceptionRenderer extends ExceptionRenderer {
    protected function _getController($exception) {
        App::uses('AppErrorController', 'Controller');
        if (!$request = Router::getRequest(false)) {
            $request = new CakeRequest();
        }
        $response = new CakeResponse(array('charset' => Configure::read('App.encoding')));
        try {
            $controller = new AppErrorController($request, $response);
        } catch (Exception $e) {
            $controller = new Controller($request, $response);
            $controller->viewPath = 'Errors';
        }
        return $controller;
    }
}

在Config / core.php 中,我设置了:

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

看起来它按预期工作,但还有更优雅的解决方案吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

这可能也是因为CakeErrorController用于所有异常 - 所以框架可以传递任何错误消息,而不必担心HTML注入或乱码输出。我假设它只是可靠的输出,因为Cake docs将控制器描述为"[omitting] a few of the normal callbacks to help ensure errors always display"。它是一个精简,精简的控制器,用于特定目的。

不幸的是,这意味着他们已经对CakeErrorController的beforeRender方法进行了硬编码,因此无法将其关闭。我能想到的唯一简单的选择就是hacky ......

  1. 创建一个自定义错误视图,该视图使用PHP的htmlspecialchars_decod()函数将转义后的文本转换回非转义文本。 (如果你想要彻底,你也会检查编码等。基本上反转h()对你的字符串做了什么)
  2. 将邮件转换为对象(因为beforeRender没有转义对象)。
  3. 幸运的是,文档中提供了正确的解决方法,您已经明白了。

    只是为了将一些HTML放入您的视图中感觉很多工作,因为这样做是很多工作。 MVC应该有助于区分您的问题,但是您通过在Controller中而不是在View中创建HTML来破坏分离。