2010-03-31 110 views

回答

51

_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

我猜重定向发送回301/302用一个新的URL,浏览器,而前进简单的“转发”的要求,以内部不同的控制器动作,但保持URL相同,所以浏览器没有按”不知道任何不同。

0

重定向操作结束当前页面的过程,并重定向到另一个。当浏览器收到重定向时,所有上下文都会改变(新的控制器/动作)。它连接到一个新的URL

而远期将留在同一页上,但会留下上下文不变。你可以看到这是一个函数调用。你的意见将像往常一样加载。

1

1-重定向创建具有首标()信息[302实测值或301 ==永久移动]及其将得到到调度周期再次

2-向前变化执行流到该新新的响应无需重新申请进入调度过程中再次

4

你会使用_forward()为您希望URL保持不变的情况下 - 虽然提防,但它确实意味着你使用任何控制器基类被称为两次。

这看起来很明显或微不足道,但如果没有记住的话,真的可能会搞砸你的应用程序设计,因为直观的理解流程是一个请求调用一个控制器实例。例如。这意味着请求范围单身人士已将声明为static,或_forward()将会破坏它们。

68

想象一下你在办公室里接到一个电话。有人想谈谈销售。如果你说“请拨打123456”并挂断,这是重定向。如果你说“等一分钟”,然后把电话转给他们,这是转发。 ;)

+12

如果你只是把它们搁置,忘记它们,这是一个无限循环? – 2011-09-05 11:40:57

+1

@蒂姆喷泉我已经与时代华纳有线公司合作了15年。 – kenitech 2012-11-04 21:48:29