2010-10-27 84 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请求(一个找到重定向,第二个执行它),另一个只有一个在调度过程之前被调用(纠正我,如果我错了)。