回答
_forward()
只是前锋一切到另一个控制器动作,同时_redirect()
发送一个报头,这意味着你创建一个新的HTTP请求并到它的整个调度过程。
举例来说,如果你打电话http://example.com/foo/bar你会打电话的foo
控制器和bar
行动。如果您在bar
行动中转发到baz
动作,例如非常相同的请求中,浏览器仍然将是对相同的URL,做了重定向时同时,ZF会指示浏览器加载http://example.com/foo/baz。
从本质上讲,_forward()
确实
$request->setActionName($action)
->setDispatched(false);
而_redirect()
确实
$this->_helper->redirector->gotoUrl($url, $options);
我通常做重定向时,我想阻止装载页面,从而重新发布表单数据。
看到这些:
我猜重定向发送回301/302用一个新的URL,浏览器,而前进简单的“转发”的要求,以内部不同的控制器动作,但保持URL相同,所以浏览器没有按”不知道任何不同。
重定向操作结束当前页面的过程,并重定向到另一个。当浏览器收到重定向时,所有上下文都会改变(新的控制器/动作)。它连接到一个新的URL
而远期将留在同一页上,但会留下上下文不变。你可以看到这是一个函数调用。你的意见将像往常一样加载。
1-重定向创建具有首标()信息[302实测值或301 ==永久移动]及其将得到到调度周期再次
2-向前变化执行流到该新新的响应无需重新申请进入调度过程中再次
你会使用_forward()为您希望URL保持不变的情况下 - 虽然提防,但它确实意味着你使用任何控制器基类被称为两次。
这看起来很明显或微不足道,但如果没有记住的话,真的可能会搞砸你的应用程序设计,因为直观的理解流程是一个请求调用一个控制器实例。例如。这意味着请求范围单身人士已将声明为static
,或_forward()将会破坏它们。
想象一下你在办公室里接到一个电话。有人想谈谈销售。如果你说“请拨打123456”并挂断,这是重定向。如果你说“等一分钟”,然后把电话转给他们,这是转发。 ;)
如果你只是把它们搁置,忘记它们,这是一个无限循环? – 2011-09-05 11:40:57
@蒂姆喷泉我已经与时代华纳有线公司合作了15年。 – kenitech 2012-11-04 21:48:29