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);
}