2013-10-11 4 views
2

надеюсь, что вы можете помочь мне с этой странной проблемой: Я пытаюсь перенаправить внутри контроллера, но Кохана продолжает бросать исключение, что я просто не могу понять, почему: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} 

Line 123 в Cadastro.php является «$ this-> перенаправлять ('/ Дадос', 302); ", как описано выше. Кто-нибудь может помочь мне показать, что я делаю неправильно? Я выполняю точные направления documentation

Благодарности

ответ

5

Давайте посмотрим, что произойдет.

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

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

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

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

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

Исключение должно пузырек до Request_Client_Internal::execute_request() где следующий блок поймать должен обрабатывать его:

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

Спасибо за вашу помощь Darsstar, но это не полностью сработало для меня. Я вижу, ГДЕ, как вы указали, возникает исключение, но я все еще не могу понять, ПОЧЕМУ это происходит. Тем не менее, меня беспокоит то, что он по-прежнему не перенаправляется. Я вызвал контроллер через ajax Jquery, чтобы проверить форму на стороне сервера перед перенаправлением. Теперь, с вашей помощью, вызов ajax больше не возвращает данные об исключении, он возвращает ИСТОЧНИК КОДА страницы, на которую я хочу перенаправить. Вы знаете, почему? – Andrade

+1

Что касается WHY, то возникает исключение, так как разработчики Kohana решили, что они будут перенаправлять через предоставленный вспомогательный метод. Что касается того, почему вы получаете SOURCE CODE, я понятия не имею ... Если вы не имеете в виду страницу [Kohana error] (http://kohanaframework.org/3.3/guide/kohana/errors#example). Вы можете попробовать $ this-> response-> status (302) -> headers ('Location', '/ dados'); и посмотрим, лучше ли это. (Возможно, вы захотите включить логику из [HTTP_Exception_Redirect :: location()] (http://kohanaframework.org/3.3/guide-api/HTTP_Exception_Redirect#location) тоже.) – Darsstar

+0

Это потому, что это то, что запрос '$ this-> ('/ dados') 'должен достигнуть, выставив instanace из HTTP_Exception_Redirect. Но, похоже, он никогда не достигает Request_Client_Internal :: execute_request(), потому что он попадает куда-то посередине. Что потенциально может указывать на то, что ваш контроллер становится толстым. Также '$ this-> response = Response :: factory() -> status (302) -> headers ('Location', '/ dados');' немного чище, так как вы начинаете с чистого листа, насколько ответ объект. – Darsstar

 Смежные вопросы

  • Нет связанных вопросов^_^