Zend重定向:这两种方式有什么区别?

3

这两个词之间有什么真正的区别吗?

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

并且。
$request->setControllerName('controller')
        ->setActionName('action');

我的猜测是第一个可能在幕后使用第二个。有人知道吗?

3个回答

4
Redirector助手允许您使用重定向对象来满足应用程序重定向到新URL的需求。与_redirect()方法相比,它提供了许多优点,例如能够将站点范围的行为预配置到重定向对象中或使用类似于Zend_Controller_Action::_forward()的内置gotoSimple($action,$controller,$module,$params)接口。与请求对象中的setController()和setAction()相比,主要区别在于您将更改URL(302重定向),而不仅仅是操作。此外,正如您所看到的,_redirect()方法是重定向器助手的快捷方式,它提供了比仅重定向更多的功能。您可以在此处查看这些功能: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

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


4

区别在于Redirector助手只发送HTTP重定向标头,而更改请求参数需要运行dispatcher(如果已经运行,则再次运行)才能进行成功的重定向,因此在何处调用该方法非常重要。

似乎最大的区别是第一个至少会发出两个HTTP请求(一个用于查找重定向,第二个用于执行它),而另一个仅在调度过程之前调用时执行一次(如果我错了,请纠正我)。


2
第一种方法是通过发送302头来进行物理重定向。第二种方法更类似于_forward()的功能-改变当前请求的控制器名称和操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接