2010-10-27 83 views
3

之間也是有差別的Zend的重定向什麼是這兩個方面

$this->_redirect('controller/action'); 

之間的真正區別
$request->setControllerName('controller') 
     ->setActionName('action'); 

我的猜測是,第一個也許使用幕後的第二個。有人知道嗎?

回答

4

的重定向助手允許 使用轉向器對象幫助 自己的應用 轉向需要一個新的URL。它提供了對_redirect 許多好處() 方法,如能 預配置整個站點的行爲 在轉向器對象或使用 內置gotoSimple($行動, $控制器,$模塊,$ params)方法 接口類似於 Zend_Controller_Action :: _ forward()。

與請求對象中的setController()和setAction()相比,主要區別在於您將更改url(302重定向),而不僅僅是操作。另外,正如你所看到的,_redirect()方法是redirecotor helper的一個快捷方式,它提供的功能遠不止是重定向。你可以在這裏看到這些:http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#Redirector

的$此 - > _ forward()方法做同樣的setController()和setAction命令(),是依靠Zend_Controller_Action類的方法:

final protected function _forward($action, $controller = null, $module = null, array $params = null) 
{ 
    $request = $this->getRequest(); 

    if (null !== $params) { 
     $request->setParams($params); 
    } 

    if (null !== $controller) { 
     $request->setControllerName($controller); 

     // Module should only be reset if controller has been specified 
     if (null !== $module) { 
      $request->setModuleName($module); 
     } 
    } 

    $request->setActionName($action) 
      ->setDispatched(false); 
} 

如果你在Zend_Controller_Action上,你可以使用上面的這個方法,但是如果你在Zend_Controller_Plugin上,例如你需要直接使用請求對象。

例如,當您提交表單時,如果用戶刷新頁面,那麼這是一個很好的實踐重定向而不是轉發,以防止表單被提交兩次。

有關此proccess的更多信息:

http://framework.zend.com/manual/en/zend.controller.dispatcher.html

http://devzone.zend.com/article/11978

2

第一個是通過發送302頭進行物理重定向。第二個更類似於_forward()所做的 - 更改當前請求的控制器名稱和操作。

4

不同的是,重定向助手只是將HTTP重定向頭,同時改變的請求參數要求調度到(如果已經運行再一次)來運行,做一個成功的重定向,所以你在哪裏是很重要的調用該方法。

似乎最大的區別在於第一個至少有兩個HTTP請求(一個找到重定向,第二個執行它),另一個只有一個在調度過程之前被調用(糾正我,如果我錯了)。