我在CakePHP网站上有以下代码作为我的AppError文件:
<?php
class AppError extends ErrorHandler
{
function _outputMessage($template)
{
$this->controller->render($template, 'error');
$this->controller->afterFilter();
echo $this->controller->output;
}
function error404 ()
{
$this->set('title_for_layout', 'Not Found (404)');
}
}
?>
第一个函数可以正常工作,使所有错误都使用错误布局而不是默认布局。但第二个功能导致应用程序爆炸......为什么?它不应该只是在错误处理程序中扩展error404函数吗?
由于
答案 0 :(得分:2)
它扩展了类,并且AppError从ErrorHandler.So继承了所有方法,如果你没有方法error404(),AppError对象将调用它的父方法,在这种情况下,ErrorHandler中的error404;
但是,如果你定义已经在ErrorHandler中退出的方法,它将不会“扩展它”,而是“覆盖它”。 换句话说:如果你创建方法error404并且这个方法被AppError对象调用,它将调用它的版本error404()
现在,如果你看一下ErrorHandler里面的error404函数
function error404($params) {
extract($params);
if (!isset($url)) {
$url = $action;
}
if (!isset($message)) {
$message = '';
}
if (!isset($base)) {
$base = '';
}
header("HTTP/1.0 404 Not Found");
$this->error(array('code' => '404',
'name' => 'Not found',
'message' => sprintf("The requested address %s was not found on this server.", $url, $message),
'base' => $base));
exit();
}
你可以看到在这个函数中存在某些行为和params。所以这就是你的应用程序崩溃的原因,某处AppError正在调用error404,期望来自parent(ErrorHandler)类的行为。尝试模仿该方法(通过包含params并在结尾处退出)。
另外$this->set('title_for_layout', 'Not Found (404)');
我认为应该是
$this->controller->set('title_for_layout', 'Not Found (404)');`