CakePHP AppError расширяют функции - PullRequest
0 голосов
/ 22 апреля 2011

У меня есть следующий код в качестве файла AppError на моем сайте CakePHP:

<?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 Ответ

2 голосов
/ 22 апреля 2011

Он расширяет класс и тем самым AppError наследует все методы из ErrorHandler. Поэтому, если у вас нет метода error404 (), объект AppError вызовет свой родительский метод, в данном случае error404 в ErrorHandler;

Однако, если вы определите метод, который уже существует в ErrorHandler, он не будет «расширять его», а «переопределит».Другими словами: если вы создаете метод error404 и этот метод вызывается объектом AppError, он будет вызывать свою версию error404 ()

Теперь, если вы посмотрите на функцию error404 внутри ErrorHandler

 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();
 }

вы можете видеть, что есть определенное поведение и параметры ожидаются в этой функции.Вот почему ваше приложение падает, где-то AppError вызывает error404, ожидая поведения от родительского (ErrorHandler) класса. Попробуйте подражать методу (включая params и выход в конце).

Также $this->set('title_for_layout', 'Not Found (404)'); Iдумаю, что это должно быть

 $this->controller->set('title_for_layout', 'Not Found (404)');`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...