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了)正如上面所说:
执行另一个操作。如果在preDispatch()中调用,则 将跳过当前请求的操作以支持新操作。 否则,在处理当前操作后,该操作 将执行_forward()中请求的\u向前($action,$controller=null,$module=null,array$params=null):
重定向到另一个位置。此方法采用URL和一组可选选项。通过 默认情况下,它执行HTTP 302重定向\u重定向($url,array$options=array()):
为了更好地理解它。\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的问题。他可以继续下去。