Php Zend重定向什么';这两种方法的区别是什么
两者之间有什么真正的区别吗Php Zend重定向什么';这两种方法的区别是什么,php,zend-framework,Php,Zend Framework,两者之间有什么真正的区别吗 $this->_redirect('controller/action'); 及 我猜第一个可能在幕后使用第二个。有人知道吗 第一个是通过发送302个头的物理重定向。第二个更类似于_forward()的功能—更改当前请求的控制器名称和操作。不同之处在于,重定向器帮助程序只发送HTTP重定向头,而更改请求参数需要运行调度程序(如果已运行,则再次运行)以成功重定向,因此,在何处调用该方法很重要 看起来最大的区别在于,第一个请求至少发出两个HTTP请求(一个用于查找
$this->_redirect('controller/action');
及
我猜第一个可能在幕后使用第二个。有人知道吗 第一个是通过发送302个头的物理重定向。第二个更类似于_forward()的功能—更改当前请求的控制器名称和操作。不同之处在于,重定向器帮助程序只发送HTTP重定向头,而更改请求参数需要运行调度程序(如果已运行,则再次运行)以成功重定向,因此,在何处调用该方法很重要 看起来最大的区别在于,第一个请求至少发出两个HTTP请求(一个用于查找重定向,第二个用于执行重定向),另一个在分派进程之前调用时只发出一个请求(如果我错了,请纠正我) 重定向器帮助程序允许您 使用重定向器对象来实现 您的应用程序对 重定向到新的URL。它提供 与_redirect()相比有许多好处 方法,例如能够 将站点范围的行为预配置为 重定向器对象或使用 内置gotoSimple($action, $controller、$module、$params) 接口类似于 Zend_控制器_操作::_forward() 与请求对象中的setController()和setAction()相比,主要区别在于您将更改url(302重定向),而不仅仅是更改操作。此外,正如您所看到的,_redirect()方法是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_插件上,你需要直接使用请求对象
例如,当您提交表单时,如果用户刷新页面,这是一个很好的实践重定向,而不是转发,以防止表单被提交两次
有关此过程的详细信息:
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);
}