Перехват Kohana_Request_Exception в Kohana v3 во время выполнения - неожиданное поведение - PullRequest
1 голос
/ 05 декабря 2010

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

Вот упрощенная версия, чтобы продемонстрировать проблему:

try {
    // Instantiate your Request object
    $request = Request::instance();
    // The give it a try, to see if its a valid request
    $request->execute();
}
catch (Kohana_Request_Exception $e) {
    header('Content-Type: text/html; charset='.Kohana::$charset, TRUE, 404);
    echo Request::factory('err/404')->send_headers()->execute()->response;
    exit;
}
echo $request->send_headers()->response;

Итак, я перехожу на несуществующий URL-адрес, такой как http://example.local/moo/, и получаюследующий ответ

Kohana_Request_Exception [ 0 ]: Unable to find a route to match the URI: moo

Вот что происходит: запрос выполняется, сбой с Kohana_Request_Exception, он перехватывается НО, когда я пытаюсь создать новый объект запроса, Request::factory('err/404') этот запрос выдает ошибку из моего первого запроса ....!?wtf ??

Я возился с этим в течение хорошего часа и так же озадачен, как и когда начал.Разве новый запрос от фабрики не должен знать о старом запросе?Почему этот код работает неправильно, когда я по сути скопировал его из ответа d00d?

// Release version and codename
const VERSION  = '3.0.7';
const CODENAME = 'hattrick';

Кто-то указывает мне правильное направление ... спасибо, ребята.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2010

Aha!Спасибо, ребята, но я понял это ... Я должен был взглянуть на трассировку стека немного ближе, метод before() контроллера шаблона страницы ошибки выдавал новую ошибку, когда он пытался проверить аутентификацию, используя Request::instance() Я изменил ее на Request::current() и все блестит.

Спасибо за помощь!

0 голосов
/ 05 декабря 2010

Это потому, что в Request::factory('err/404') часть err/404 является URL-адресом, который также пытается соответствовать вашим маршрутам. Будет ли это когда-нибудь совпадать, т.е. у вас есть маршрут с чем-то вроде этого ...

Route::set('errors', 'err/<action>', array('action' => '404|500')) {}

Вы также должны отправить 404 через ...

$request->status = 404;
...