之间是否有任何真正的区别
$this->_redirect('controller/action');
和
$request->setControllerName('controller')
->setActionName('action');
我的猜测是第一个可能在幕后使用第二个。有人知道吗?
答案 0 :(得分:4)
不同之处在于重定向器帮助程序只发送HTTP重定向标头,而更改请求参数则需要运行调度程序(如果已经运行,则再次运行)以成功重定向,因此它是重要的是你在哪里称之为方法。
似乎最大的区别是第一个发出至少两个HTTP请求(一个用于查找重定向,第二个用于执行它),另一个只在调度进程之前调用一个(如果我错了,请纠正我)
答案 1 :(得分:4)
重定向器帮助程序允许您 使用重定向器对象来实现 您的应用程序的需求 重定向到新的URL。它提供 比_redirect()有很多好处 方法,如能够 预配置全站点行为 重定向器对象或使用 内置gotoSimple($ action, $ controller,$ module,$ params) 界面类似于 化Zend_Controller_Action :: _向前()。
与请求对象中的setController()和setAction()相比较的主要区别是您将更改网址(302重定向),而不仅仅是操作。此外,正如您所看到的,_redirect()方法是redirecotor帮助程序的快捷方式,它提供的功能比仅重定向更多。你可以在这里看到:http://framework.zend.com/manual/en/zend.controller.actionhelpers.html#Redirector
$ this-> _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,则需要直接使用请求对象。
例如,当您提交表单时,如果用户刷新页面,那么这是一个很好的实践重定向而不是转发,以防止表单被提交两次。
有关此过程的更多信息:
http://framework.zend.com/manual/en/zend.controller.dispatcher.html
答案 2 :(得分:2)
第一个是通过发送302标头进行物理重定向。第二个更类似于_forward()的作用 - 更改当前请求的控制器名称和操作。