CakePHP AppError扩展函数

时间:2011-04-22 10:57:18

标签: php cakephp

我在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函数吗?

由于

1 个答案:

答案 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)');`