Zend框架中的forward和redirect或setRenderView有什么区别?

时间:2012-04-05 15:41:16

标签: php zend-framework

  

可能重复:
  What is the difference between redirect and forward in Zend framework

我是zend框架的新手,当我尝试在控制器中使用foward,redirect,setViewRender时,他们的不同之处是什么?

4 个答案:

答案 0 :(得分:2)

正如official docs所说:

  • _forward($action, $controller = null, $module = null, array $params = null):执行其他操作。如果在preDispatch()中调用,则 将跳过当前请求的操作以支持新操作。 否则,在处理当前操作后,操作 _forward()中请求的将被执行。
  • _redirect($url, array $options = array()):重定向到其他位置。此方法采用URL和一组可选选项。通过 默认情况下,它执行HTTP 302重定向。

Read more要更好地理解它。

答案 1 :(得分:0)

我非常确定重定向会将您重定向到特定页面/控制器,因此会经历所有预览过程,包括如果您可以查看该页面,setViewRender将只输出您选择的视图并忽略所有控制器等处理的东西。 (我暂时没用过zend)

答案 2 :(得分:0)

_redirect会创建一个全新的http请求,而_forward只会转发请求。我在zend_registry中设置变量时意识到这一点,这听起来有点偏离轨道但是当你使用_request时,所有的请求变量和头文件以及注册表变量都完全重置,而在_forward的情况下,它只是转发所有这些东西。这就像您之前提供的信息以及_forward的更多信息一样。

对于setViewRenderer我真的很喜欢这个想法,我的意思是这就像依赖注入一样。您实际上不需要具有默认视图,您可以为给定操作提供新视图。如果你研究this,我认为你会得到最好的答案。

答案 3 :(得分:0)

_forward是内部重定向。在_redirect发送一个标题告诉客户端浏览器转到其他URL时,_forward告诉Dispatcher在其他地方内部重定向请求。

如果您考虑正常的调度顺序:

 preDispatch()
 someAction()
 anotherAction()
 postDispatch()

在该进程中的任何一点调用_forward都将导致以下步骤无法执行。因此,如果您在_forward中致电preDispatch(),则不会调用someAction(),依此类推。如果_forward()中的someAction()并且您正在使用viewRenderer操作助手来呈现视图(您让框架选择要呈现的视图脚本),则不会在{{1中呈现视图脚本}}

当请求转发到新的控制器/模块时,整个调度过程将在那里重复。

注意:

如果你在someAction()内转发someAction(),你必须这样做

anotherAction()

您应该向return $this->_forward('another'); 添加return,否则您的当前操作将继续执行,然后转发给其他操作。

另请注意,将呈现的视图将为$this->_forward()

在进行重定向时,ZF会指示浏览器加载 http://example.com/controller-name/action-name ,因为another.phtml发送标题,这意味着你创建一个新的HTTP请求并使用它完成整个调度过程。

最后要在动作中呈现某个视图,请使用_redirect()动作助手:

viewRenderer