Нужна помощь с Kohana 3 и поймать весь маршрут, превращающийся в ошибку 404 - PullRequest
0 голосов
/ 19 мая 2010

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

Вот последний маршрут в моем bootstrap.php

Route::set('default', '<path>', array('path' => '.+'))
    ->defaults(array(
        'controller' => 'errors',
        'action'     => '404',
    ));

Однако, я продолжаю получать это исключение, когда пытаюсь перейти на несуществующую страницу

Kohana_Exception [0]: обязательный маршрут параметр не передан: путь

Если я сделаю сегмент <path> необязательным (то есть обернем его в круглые скобки), то, похоже, он просто загрузит маршрут home, который ...

Route::set('home', '')
    ->defaults(array(
        'controller' => 'home',
        'action'     => 'index',
    ));

Сначала определяется домашний маршрут.

Я выполняю свой основной запрос вот так

$request = Request::instance();


try {

    // Attempt to execute the response
    $request->execute();

} catch (Exception $e) {


   if (Kohana::$environment === Kohana::DEVELOPMENT) throw $e;

    // Log the error
    Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));

    // Create a 404 response
    $request->status = 404;
    $request->response = Request::factory(Route::get('default')->uri())->execute();

}

$request->send_headers();
echo $request->response;

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

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

class Controller_Errors extends Controller_Base {

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

    public function action_404() {


        $this->bodyClass[] = '404';

        $this->internalView = View::factory('internal/not_found');

        $longTitle = 'Page Not Found';

        $this->titlePrefix = $longTitle;


    }
}

Почему не отображается моя страница с ошибкой 404?

Ответы [ 2 ]

1 голос
/ 19 мая 2010

Для своих проектов я никогда не указывал какой-либо отдельный отдельный маршрут для 404. Я просто ловлю исключения, генерируемые при маршрутизации, когда не найдено подходящего маршрута.

Вот как я обрабатываю все исключения, обнаруженные в Кохане. Я надеюсь, что это поможет вам.

try
{
    try
    {
        $request = Request::instance();
        $request->execute();
    }
    catch (ReflectionException $e)
    {
        Kohana::$log->add(Kohana::ERROR_404, Kohana::exception_text($e));

        if (!IN_PRODUCTION)
        {
        throw $e;
        }

        $request->response = Request::factory('err/404')->execute();
    }
    catch (Exception404 $e)
    {
        Kohana::$log->add(Kohana::ERROR_404, Kohana::exception_text($e));

        if (!IN_PRODUCTION)
        {
        throw $e;
        }

        $request->response = Request::factory('err/404')->execute();
    }
    catch (Kohana_Request_Exception $e)
    {
        Kohana::$log->add(Kohana::ERROR_404, Kohana::exception_text($e));

        if (!IN_PRODUCTION)
        {
        throw $e;
        }

        header('Content-Type: text/html; charset='.Kohana::$charset, TRUE, 404);
        echo Request::factory('err/404')->send_headers()->execute()->response;
        exit;
    }
    catch (exception $e)
    {
        Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));

        if (!IN_PRODUCTION)
        {
        throw $e;
        }

        $request->status = 500;
        $request->response = Request::factory('err/500')->execute();
    }
}
catch (exception $e)
{
        if (!IN_PRODUCTION)
        {
            throw $e;
        }
        echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        </head>
        <body>
        here is the message that everything is veeeery bad
        </body>
        </html>';
        exit;
}

Exception404:

class Kohana_Exception404 extends Kohana_Exception
{
    public function __construct($message = 'error 404', array $variables = NULL, $code = 0)
    {
        parent::__construct($message, $variables, $code);
    }
 }
0 голосов
/ 19 мая 2010

Ах, я понял это.

Эта строка ...

$request->response = Request::factory(Route::get('default')->uri())->execute();

Устанавливал ответ на результат Route::get('default')->uri(). Глядя на это дальше, я понял, что он вернет пустую строку, которая будет соответствовать маршруту home выше. Я чувствую себя глупо ....

...