Как отловить ошибку HTTP_Exception_404 в Кохане - PullRequest
2 голосов
/ 16 сентября 2011

Я пытался следовать инструкциям здесь: http://kohanaframework.org/3.0/guide/kohana/tutorials/error-pages Но по какой-то причине я не могу перехватить HTTP_Exception_404. Я все еще получаю ужасную страницу с ошибкой, а не свою пользовательскую страницу.

Также, когда я набираю URL ошибки / 404 / Сообщение, я получаю ужасное сообщение об ошибке Kohana HTTP 404.

Вот структура файлов:

  • модули
    • мой
      • init.php
      • классы
        • контроллер
          • error_handler.php
        • http_response_exception.php
        • kohana.php
      • просмотры
        • error.php

Код:

init.php:

<?php defined('SYSPATH') or die('No direct access');

Route::set('error', 'error/<action>(/<message>)', array('action' => '[0-9]++', 'message' => '.+'))
    ->defaults(array(
            'controller' => 'error_handler'
));

http_response_exception.php:

<?php defined('SYSPATH') or die('No direct access');

class HTTP_Response_Exception extends Kohana_Exception {


    public static function exception_handler(Exception $e)
    {

            if (Kohana::DEVELOPMENT === Kohana::$environment)
            {
                    Kohana_Core::exception_handler($e);
            }
            else
            {
                    Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));

                    $attributes = array
                    (
                            'action'  => 500,
                            'message' => rawurlencode($e->getMessage()),
                    );

                    if ($e instanceof HTTP_Response_Exception)
                    {
                            $attributes['action'] = $e->getCode();
                    }

                    // Error sub-request.
                    echo Request::factory(Route::url('error', $attributes))
                            ->execute()
                            ->send_headers()
                            ->response;
            }
    }
}

kohana.php:

<?php defined('SYSPATH') or die('No direct script access.');

class Kohana extends Kohana_Core
{

    /**
     * Redirect to custom exception_handler
     */
    public static function exception_handler(Exception $e)
    {
            Error::exception_handler($e);
    }

} // End of Kohana

error_handler.php:

<?php defined('SYSPATH') or die('No direct access');

class Controller_Error_handler extends Controller {

    public function  before()
    {
            parent::before();

            $this->template = View::factory('template/useradmin');
            $this->template->content = View::factory('error');

            $this->template->page = URL::site(rawurldecode(Request::$instance->uri));

            // Internal request only!
            if (Request::$instance !== Request::$current)
            {
                    if ($message = rawurldecode($this->request->param('message')))
                    {
                            $this->template->message = $message;
                    }
            }
            else
            {
                    $this->request->action = 404;
            }
    }

    public function action_404()
    {
            $this->template->title = '404 Not Found';

            // Here we check to see if a 404 came from our website. This allows the
            // webmaster to find broken links and update them in a shorter amount of time.
            if (isset ($_SERVER['HTTP_REFERER']) AND strstr($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']) !== FALSE)
            {
                    // Set a local flag so we can display different messages in our template.
                    $this->template->local = TRUE;
            }

            // HTTP Status code.
            $this->request->status = 404;
    }

    public function action_503()
    {
            $this->template->title = 'Maintenance Mode';
            $this->request->status = 503;
    }

    public function action_500()
    {
            $this->template->title = 'Internal Server Error';
            $this->request->status = 500;
    }

} // End of Error_handler

Я действительно не вижу, где я поступил неправильно. Заранее спасибо за любую помощь.

Ответы [ 5 ]

2 голосов
/ 04 февраля 2012

После ОЧЕНЬ ДЛИННОГО ВРЕМЕНИ поиска я наконец-то нашел решение своей маленькой проблемы.

Вот пошаговое руководство о том, как загрузить свои собственные страницы ошибок с помощью Kohana.3.2:

  1. Изменить переменную окружения в начальной загрузке.

Здесь у вас есть несколько вариантов:

a.Делайте то, что они говорят в документации по bootstrap.php :

/**
 * Set the environment status by the domain.
 */

if (strpos($_SERVER['HTTP_HOST'], 'kohanaphp.com') !== FALSE)
{
    // We are live!
    Kohana::$environment = Kohana::PRODUCTION;

    // Turn off notices and strict errors
    error_reporting(E_ALL ^ E_NOTICE ^ E_STRICT);
}

b.Или просто добавьте эти две строки без «if»:

Kohana::$environment = Kohana::PRODUCTION;
error_reporting(E_ALL ^ E_NOTICE ^ E_STRICT);

c.Я не пробовал таким образом, но в новом bootstrap.php у вас есть этот код:

/**
 * Set Kohana::$environment if a 'KOHANA_ENV' environment variable has been supplied.
 *
 * Note: If you supply an invalid environment name, a PHP warning will be thrown
 * saying "Couldn't find constant Kohana::<INVALID_ENV_NAME>"
 */
if (isset($_SERVER['KOHANA_ENV']))
{
    Kohana::$environment = constant('Kohana::'.strtoupper($_SERVER['KOHANA_ENV']));
}

Я предполагаю, что вы могли бы просто присвоить значение «production» для «$ _SERVER ['KOHANA_ENV']» доэти строки.

Опять же, как я уже сказал, я не пробовал, но это должно работать.

Лично я только что закомментировал эти строки кодов.

2 Теперьвам нужно добавить несколько конфигураций в файл "ini.php" или в файл "bootstra.php".

<?php defined('SYSPATH') or die('No direct script access.');

/**
 * Turn errors into exceptions. 
 */
Kohana::$errors = true;

/**
 * Custom exception handler.
 */
restore_exception_handler();
set_exception_handler(array('Exception_Handler', 'handler'));

/**
 * Error route.
 */
Route::set('error', 'error/<action>(/<message>)', array('action' => '[0-9]++', 'message' => '.+'))
->defaults(array(
    'controller' => 'exception_handler'
));

Это то, чего не хватало, и это усложнилось.В остальном вы можете просто следовать документации Kohana3.2 или получить модуль, который я добавил в репозиторий в GitHub: https://github.com/jnbdz/Kohana-error

2 голосов
/ 02 февраля 2012

Все, что вам нужно сделать, это установить путь к другому представлению в вашем bootstrap.php add:

Kohana_Exception::$error_view = 'error/myErrorPage';

, который будет анализировать все переменные, которые в настоящее время анализируются на странице ошибки, которая находится в:

system/views/kohana/error.php

т.е.:

<h1>Oops [ <?= $code ?> ]</h1>
<span class="message"><?= html::chars($message) ?></span>
2 голосов
/ 20 сентября 2011

Прежде всего, вам нужно убедиться, что вы загружаете свой модуль, включив его в раздел модулей вашего файла application / bootstrap.php следующим образом:

Kohana::modules(array(
'my'=>MODPATH.'my'
)
);

Тот факт, что вы упомянули, что происходит напрямуюна URL вашего контроллера обработчиков ошибок запускается ошибка 404. Я думаю, что ваш модуль не был загружен.

Я бы также предложил несколько дополнительных изменений.

http_response_exception.php не нужнорасширить Kohana_Exception, так как этот класс не исключение, а обработчик исключений.В этих же строках более подходящим именем класса может быть Exception_Handler, поскольку класс не представляет исключение, а обрабатывает их.Во-вторых, из-за того, как вы назвали этот файл, он должен быть расположен в modules / my / classes / http / response / exception.php.Кроме этого, код для этого класса выглядит хорошо.

Аналогично, из-за того, как вы назвали свой контроллер, он должен быть расположен и назван немного по-другому.Переместите его в modules / my / classes / controller / error / handler.php

Помните, что подчеркивание в имени класса означает новый каталог, согласно http://kohanaframework.org/3.2/guide/kohana/conventions

Наконец, я неНе думаю, что вам действительно нужно расширять класс Kohana_Core, а просто зарегистрировать свой собственный обработчик исключений.Вы можете зарегистрировать свой пользовательский обработчик исключений либо в файле начальной загрузки вашего приложения, либо в файле инициализации вашего модуля со следующим общим кодом:

set_exception_handler(array('Exception_Handler_Class', 'handle_method'));

Вот обработчик исключений клиента, который я использую, который очень похож на ваш:

<?php defined('SYSPATH') or die('No direct script access.');

class Exception_Handler {

public static function handle(Exception $e)
{
    $exception_type = strtolower(get_class($e));
    switch ($exception_type)
    {
        case 'http_exception_404':
            $response = new Response;
            $response->status(404);
            $body = Request::factory('site/404')->execute()->body();
            echo $response->body($body)->send_headers()->body();
            return TRUE;
            break;
        default:
            if (Kohana::$environment == Kohana::DEVELOPMENT)
            {
                return Kohana_Exception::handler($e);
            }
            else
            {
                Kohana::$log->add(Log::ERROR, Kohana_Exception::text($e));
                $response = new Response;
                $response->status(500);
                $body = Request::factory('site/500')->execute()->body();
                echo $response->body($body)->send_headers()->body();
                return TRUE;
            }
            break;
    }
}

}
2 голосов
/ 03 октября 2011

Вы используете устаревшую документацию. HTTP_Exception_404 был включен в 3.1, и вы пытаетесь реализовать решение от 3.0.

См. документацию для вашей версии Kohana для решения, которое работает.

0 голосов
/ 16 сентября 2011

Каждое подчеркивание является разделителем каталогов в имени класса. Поэтому, когда вы называете свой класс Http_Response_Exception, класс должен быть в classes/http/response/exception.php. В противном случае класс не будет найден автозагрузчиком Kohana.

редактировать

Хм, похоже, что документация неверна в этом аспекте. classes/http_response_exception.php не имеет смысла.

...