我在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',
...
));
看起来它按预期工作,但还有更优雅的解决方案吗?
谢谢。
答案 0 :(得分:0)
这可能也是因为CakeErrorController用于所有异常 - 所以框架可以传递任何错误消息,而不必担心HTML注入或乱码输出。我假设它只是可靠的输出,因为Cake docs将控制器描述为"[omitting] a few of the normal callbacks to help ensure errors always display"。它是一个精简,精简的控制器,用于特定目的。
不幸的是,这意味着他们已经对CakeErrorController的beforeRender
方法进行了硬编码,因此无法将其关闭。我能想到的唯一简单的选择就是hacky ......
htmlspecialchars_decod()
函数将转义后的文本转换回非转义文本。 (如果你想要彻底,你也会检查编码等。基本上反转h()
对你的字符串做了什么)beforeRender
没有转义对象)。幸运的是,文档中提供了正确的解决方法,您已经明白了。
只是为了将一些HTML放入您的视图中感觉很多工作,因为这样做是很多工作。 MVC应该有助于区分您的问题,但是您通过在Controller中而不是在View中创建HTML来破坏分离。