【发布时间】:2015-06-09 10:22:39
【问题描述】:
如何在 CakePHP 2.1 中为我的错误使用自定义布局?
我浏览了文档并看到了自定义处理程序等的各种提及,但在选择要使用的布局方面却一无所获……有什么想法吗?
在像 1.3 之前的 CakePHP 版本中,您可以创建一个 AppError 类,但这将不再起作用,因为现在 CakeError 已被贬低,并且根据新应用程序的文档,这样做会受到蔑视。
【问题讨论】:
如何在 CakePHP 2.1 中为我的错误使用自定义布局?
我浏览了文档并看到了自定义处理程序等的各种提及,但在选择要使用的布局方面却一无所获……有什么想法吗?
在像 1.3 之前的 CakePHP 版本中,您可以创建一个 AppError 类,但这将不再起作用,因为现在 CakeError 已被贬低,并且根据新应用程序的文档,这样做会受到蔑视。
【问题讨论】:
您可以在 beforeRender() 函数中更改布局,如下所示:-
public function beforeRender(){
if($this->name == 'CakeError'){
$this->layout = 'error';
}
}
【讨论】:
这就是我在 CakePHP 2.2.2 中所做的:我更改了 core.php 中的异常渲染器并扩展了 ExceptionRenderer,其中 MyExceptionRenderer 仅覆盖了父方法之一。该发行版已经包含文件 app/View/Layouts/error.ctp 所以我只是稍微编辑了一下。
我还注意到 CakeError 已被弃用,所以这对我有用。
app/Config/core.php:
Configure::write('Exception', array(
'handler' => 'ErrorHandler::handleException',
'renderer' => 'MyExceptionRenderer',
'log' => true
));
app/Lib/Error/MyExceptionRenderer.php:
App::uses('ExceptionRenderer', 'Error');
class MyExceptionRenderer extends ExceptionRenderer {
protected function _outputMessage($template) {
$this->controller->layout = 'error';
parent::_outputMessage($template);
}
}
【讨论】:
在 core.php 中,我将错误处理程序和异常处理程序切换为自定义处理程序:
App::uses('MyErrorHandler', 'Tools.Error');
Configure::write('Error', array(
'handler' => 'MyErrorHandler::handleError',
'level' => E_ALL & ~E_DEPRECATED & ~E_STRICT,
'trace' => true
));
Configure::write('Exception', array(
'handler' => 'MyErrorHandler::handleException',
'renderer' => 'Tools.MyExceptionRenderer',
'log' => true
));
那么你应该把你的类放在Lib/Error/(插件或不)
【讨论】:
if ($this->name == 'Error') { // switch layout with $this->layout = 'some' }
随便写
$this->layout = 'my_error'
在您的 error400.ctp 和 error500.ctp 文件中
在您的视图/Errors/404.ctp 视图/Errors/500.ctp
喜欢这个
<?php $this->layout = 'my_error' ?>
<!doctype html>
<html>
<head>
</head>
<body>
</body>
</html>
@faferuziel / @fetruzie 最好的问候
【讨论】: