2013-10-11 77 views
2

希望你能幫助我解決這個奇怪的問題:我想從控制器內的重定向,但Kohana的不斷拋出,我只是不明白,爲什麼一個例外:Cadastro的Kohana 3.3重定向異常

代碼.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 Line在Cadastro.php是「$這 - >重定向( '/ dados', 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); 
} 

它會創建一個異常(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()))); 
} 
+0

感謝您的幫助Darsstar,但它並沒有完全爲我工作。正如你指出的那樣,我可以看到WHERE異常被提出,但我仍然不明白爲什麼會發生這種情況。 不過,困擾我的是它仍然沒有重定向。我通過jquery的ajax調用了控制器,以便在重定向之前驗證服務器端的表單。現在,在您的幫助下,ajax調用不再返回異常數據,它返回我想要重定向到的頁面的源代碼。你有什麼想法,爲什麼? – Andrade

+1

至於爲什麼會拋出異常,這就是Kohana開發者決定通過提供的輔助方法重定向的方式。至於爲什麼你得到源代碼,我不知道...除非你的意思是[Kohana錯誤頁面](http://kohanaframework.org/3.3/guide/kohana/errors#example)。你可以嘗試$ this-> response-> status(302) - >標題('Location','/ dados');並看看這是否更好。 (你可能想要包含來自[HTTP_Exception_Redirect :: location()](http://kohanaframework.org/3.3/guide-api/HTTP_Exception_Redirect#location)的邏輯。) – Darsstar

+0

這是因爲它是'$ this->請求('/ dados')'應該通過拋出HTTP_Exception_Redirect的實例來實現。但它似乎永遠不會到達Request_Client_Internal :: execute_request(),因爲它在兩者之間被捕獲。這可能表明你的控制器變胖了。還有'$ this-> response = Response :: factory() - > status(302) - > headers('Location','/ dados');'因爲您從乾淨的石板開始,對象是關心的。 – Darsstar