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

Php Zend框架中的forward和redirect或setRenderView有什么区别?,php,zend-framework,Php,Zend Framework,可能重复: 我是zend framework的新手,当我尝试在controller中使用foward、redirect、setViewRender时,它们有什么区别?我很确定重定向会将您重定向到特定的页面/控制器,因此会经历所有预查看过程,包括是否可以查看页面,setViewRender将只输出您选择的视图,而忽略控制器etc处理的所有内容。(但是我有一段时间没有使用zend了)正如上面所说: \u向前($action,$controller=null,$module=null,array$

可能重复:


我是zend framework的新手,当我尝试在controller中使用foward、redirect、setViewRender时,它们有什么区别?

我很确定重定向会将您重定向到特定的页面/控制器,因此会经历所有预查看过程,包括是否可以查看页面,setViewRender将只输出您选择的视图,而忽略控制器etc处理的所有内容。(但是我有一段时间没有使用zend了)

正如上面所说:

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

为了更好地理解它。

\u重定向创建了一个全新的http请求,其中as\u forward只是简单地转发请求。我在zend_registry中设置变量时意识到了这一点,这听起来可能有点离谱,但当您使用_request时,所有请求变量、头和注册表变量都会完全重置,在_forward的情况下,它只会转发所有这些内容。这就好像你以前可以提供一些信息以及一些更多的信息,以防_forward


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

\u forward
是一种内部重定向。其中as
\u redirect
发送一个头,告诉客户端浏览器转到其他URL,\u forward告诉调度程序在内部将请求重定向到其他地方

如果考虑正常调度顺序:

 preDispatch()
 someAction()
 anotherAction()
 postDispatch()
在该进程中的任何一点调用
\u forward
,都会导致以下步骤无法执行。因此,如果在
preDispatch()
中调用
\u forward
,则不会调用
someAction()
,依此类推。如果在
someAction()
中使用
\u forward()
,并使用viewRenderer action helper渲染视图(让框架选择要渲染的视图脚本),则在
someAction()
中不会渲染视图脚本

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

注意:

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

return $this->_forward('another');
您应该将
return
添加到
$this->\u forward()
,否则当前操作将在转发到其他操作之前继续执行

还要注意,将呈现的视图将是另一个.phtml

在执行重定向时,ZF将指示浏览器加载http://example.com/controller-name/action-name 由于
\u redirect()
发送了一个头,这意味着您创建了一个新的HTTP请求,并使用它完成整个调度过程

最后,要在动作中渲染特定视图,请使用
viewRenderer
action助手:

 // Bar controller class, foo module:
    class Foo_BarController extends Zend_Controller_Action
    {
        public function addAction()
        {
            // Render 'bar/form.phtml' instead of 'bar/add.phtml'
            $this->_helper->viewRenderer('form');
        }

        public function editAction()
        {
            // Render 'bar/form.phtml' instead of 'bar/edit.phtml'
            $this->_helper->viewRenderer->setScriptAction('form');
        }

        public function processAction()
        {
            // do some validation...
            if (!$valid) {
                // Render 'bar/form.phtml' instead of 'bar/process.phtml'
                $this->_helper->viewRenderer->setRender('form');
                return;
            }

            // otherwise continue processing...
        }

    }

请看这篇关于向前与重定向的文章。你在哪里想出了
setViewRender
,我知道
setView
,我知道
render
,但我在api文档中找不到
setViewRender
。他提到了重定向、向前和设置渲染view@encodes我回答了他关于重定向和foward的问题。他可以继续下去。