Zend框架中重定向和转发有什么区别?
什么时候应该使用重定向?什么时候应该使用前进?
答案 0 :(得分:68)
想象一下,你在办公室接到电话。有人想和销售人员谈谈。如果你说“请拨打123456”并挂机,这是重定向。如果您说“等一下”并将呼叫转接给他们,则这是转发。 ;)
答案 1 :(得分:52)
_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);
当我想阻止重新加载页面导致重新发布表单数据时,我通常会进行重定向。
见这些:
答案 2 :(得分:4)
对于希望URL保持不变的情况,您可以使用 _forward() - 虽然要注意,但它确实意味着您使用的任何基本控制器类都是两次打电话。
这看似显而易见或微不足道,但如果不记住,可以真正搞砸你的应用程序设计,因为直观的流程理解是一个请求调用一个控制器实例。例如。它表示请求范围的单身人士将声明为static
,或 _forward()会将其分解。
答案 3 :(得分:2)
我猜想重定向会使用新的URL将301/302发送回浏览器,而转发只是将请求“转发”到内部的其他控制器操作,但保持URL相同,因此浏览器不会知道任何不同。
答案 4 :(得分:1)
1-redirect创建一个带有header()信息的新响应[302 Found或301 ==永久移动],它将再次进入调度周期
2-forward将执行流程更改为该新请求,而无需再次重新进入调度流程
答案 5 :(得分:0)
重定向操作结束当前页面进程并重定向到另一个进程。当浏览器收到重定向时,所有上下文都将更改(新控制器/操作)。它连接到新的URL
虽然转发将保持在同一页面上,但会保持上下文不变。您可以将其视为函数调用。您的观点将照常加载。