Kohana 3.3 Исключение перенаправления

надеюсь, вы поможете мне с этой странной проблемой: я пытаюсь перенаправить из контроллера, но Кохана продолжает выдавать исключение, и я просто не могу понять, почему:

код в Cadastro.php:

try{
     $this->redirect('/dados', 302);
} catch (Exception $e) {
                $this->response->body(Json_View::factory(array("line ".$e->getLine()." of file ".$e->getFile().":".$e->getMessage()." - trace as string: ".$e->getTraceAsString())));
}            }

сообщение трассировки стека, возвращаемое исключением в приведенном выше коде:

#0 C:\\xampp\\htdocs\\grademagica\\system\\classes\\Kohana\\HTTP.php(33): Kohana_HTTP_Exception::factory(302)
#1 C:\\xampp\\htdocs\\grademagica\\system\\classes\\Kohana\\Controller.php(127): Kohana_HTTP::redirect('\/dados', 302)
#2 C:\\xampp\\htdocs\\grademagica\\modules\\grademagica\\classes\\Controller\\Cadastro.php(123): Kohana_Controller::redirect('\/dados', 302)
#3 C:\\xampp\\htdocs\\grademagica\\system\\classes\\Kohana\\Controller.php(84): Controller_Cadastro->action_signin()
#4 [internal function]: Kohana_Controller->execute()
#5 C:\\xampp\\htdocs\\grademagica\\system\\classes\\Kohana\\Request\\Client\\Internal.php(97): ReflectionMethod->invoke(Object(Controller_Cadastro))
#6 C:\\xampp\\htdocs\\grademagica\\system\\classes\\Kohana\\Request\\Client.php(114): Kohana_Request_Client_Internal->execute_request(Object(Request), Object(Response))
#7 C:\\xampp\\htdocs\\grademagica\\system\\classes\\Kohana\\Request.php(990): Kohana_Request_Client->execute(Object(Request))
#8 C:\\xampp\\htdocs\\grademagica\\index.php(123): Kohana_Request->execute()
#9 {main}

Строка 123 в Cadastro.php — это «$this->redirect('/dados', 302);», как описано выше. Кто-нибудь может помочь мне показать, что я делаю неправильно? Я следую точным указаниям документации.

Спасибо


person Andrade    schedule 11.10.2013    source источник


Ответы (1)


Давай посмотрим что происходит.

Вы вызываете $this->redirect('/dados', 302);, так что давайте посмотрим на его исходный код:

public static function redirect($uri = '', $code = 302)
{
    return HTTP::redirect($uri, $code);
}

Хорошо, мы узнали, что $this->redirect('/dados') будет достаточно, давайте посмотрим на HTTP::redirect() далее:

public static function redirect($uri = '', $code = 302)
{
    $e = HTTP_Exception::factory($code);

    if ( ! $e instanceof HTTP_Exception_Redirect)
        throw new Kohana_Exception('Invalid redirect code \':code\'', array(
            ':code' => $code
        ));

    throw $e->location($uri);
}

Он создаст исключение (HTTP_Exception_$code), а затем выдаст его.

Исключение должно подняться до Request_Client_Internal::execute_request(), где его должен обработать следующий блок catch:

catch (HTTP_Exception $e)
{
    // Get the response via the Exception
    $response = $e->get_response();
}

Но поскольку вы поймаете исключение, оно не будет всплывать. Это один из способов исправить это.

try{
     $this->redirect('/dados', 302);
} catch (HTTP_Exception_Redirect $e) {
    throw $e;
} catch (Exception $e) {
                $this->response->body(Json_View::factory(array("line ".$e->getLine()." of file ".$e->getFile().":".$e->getMessage()." - trace as string: ".$e->getTraceAsString())));
}
person Darsstar    schedule 11.10.2013
comment
Спасибо за вашу помощь Darsstar, но это не совсем сработало для меня. Я вижу, ГДЕ возникает исключение, как вы указали, но я до сих пор не могу понять, ПОЧЕМУ это происходит. Тем не менее, что меня беспокоит, так это то, что он все еще не перенаправляет. Я вызвал контроллер через ajax Jquery, чтобы проверить форму на стороне сервера перед перенаправлением. Теперь, с вашей помощью, вызов ajax больше не возвращает данные об исключении, он возвращает ИСХОДНЫЙ КОД страницы, на которую я хочу перенаправить. У вас есть идеи, почему? - person Andrade; 13.10.2013
comment
Что касается ПОЧЕМУ возникает исключение, именно поэтому разработчики Kohana решили, что они будут выполнять перенаправление с помощью предоставленного вспомогательного метода. Что касается того, почему вы получаете ИСХОДНЫЙ КОД, я понятия не имею... Если вы не имеете в виду Кохану страница ошибки. Вы можете попробовать $this-›response-›status(302)-›headers('Location', '/dados'); и посмотреть, если это лучше. (Возможно, вы также захотите включить логику из HTTP_Exception_Redirect::location(). .) - person Darsstar; 13.10.2013
comment
Это потому, что это то, чего $this->request('/dados') должен достичь, создав экземпляр HTTP_Exception_Redirect. Но, похоже, он никогда не достигает Request_Client_Internal::execute_request(), потому что оказывается где-то посередине. Что потенциально может указывать на то, что ваш контроллер становится толстым. Кроме того, $this->response = Response::factory()->status(302)->headers('Location', '/dados'); немного чище, поскольку вы начинаете с чистого листа в том, что касается объекта Response. - person Darsstar; 14.10.2013
comment
Я думаю, что невозможно перенаправить изнутри контроллера, когда он вызывается через ajax. По-видимому, он распознает целевую (перенаправленную) страницу как возврат функции ajax. Итак, что я сделал, так это вернул json, чтобы указать, что перенаправление необходимо, и URL-адрес, который будет обработан тестом javascript на стороне клиента для перенаправления со стороны клиента. Однако все методы, описанные Darsstar, работают при синхронном вызове контроллера (не через ajax). - person Andrade; 24.10.2013