可能重复:
Zend 框架中重定向和转发有什么区别
我是zend框架的新手,当我尝试在控制器中使用foward、redirect、setViewRender时,它们有什么区别?
可能重复:
Zend 框架中重定向和转发有什么区别
我是zend框架的新手,当我尝试在控制器中使用foward、redirect、setViewRender时,它们有什么区别?
正如官方文档所说:
_forward($action, $controller = null, $module = null, array $params = null):
执行另一个动作。如果在 preDispatch() 中调用,当前请求的操作将被跳过以支持新的操作。否则,在处理完当前动作后,_forward() 中请求的动作将被执行。_redirect($url, array $options = array()):
重定向到另一个位置。此方法采用 URL 和一组可选选项。默认情况下,它执行 HTTP 302 重定向。阅读更多内容以更好地理解它。
我很确定重定向会将您重定向到特定页面/控制器,因此会经历所有预览过程,包括您是否可以查看页面,setViewRender 只会输出您选择的视图并忽略控制器的所有内容等处理。(但是我有一段时间没有使用zend)
_redirect 创建一个全新的 http 请求,而 _forward 只是转发请求。我在 zend_registry 中设置变量时意识到了这一点,这听起来可能有点偏离轨道,但是当您使用 _request 时,所有请求变量、标头和注册表变量都被完全重置,而在 _forward 的情况下,它只是转发所有这些东西。这就像您可以在 _forward 的情况下之前提供信息以及更多信息。
好吧,对于 setViewRenderer,我真的很喜欢这个想法,我的意思是这有点像依赖注入。你真的不需要有一个默认视图,你可以为给定的动作提供一个新的视图。如果您对此进行研究,我认为您会得到最好的答案。
_forward
是内部重定向。as_redirect
发送一个标头,告诉客户端的浏览器转到其他 URL,_forward 告诉调度程序在内部将请求重定向到其他地方。
如果您考虑以下的正常发货顺序:
preDispatch()
someAction()
anotherAction()
postDispatch()
在该进程中的任何时候调用_forward
都将导致以下步骤无法执行。所以如果你调用_forward
,preDispatch()
将someAction()
不会被调用等等。如果您_forward()
使用someAction()
viewRenderer 操作助手来渲染视图(您让框架选择要渲染的视图脚本),则不会在someAction()
.
当请求被转发到新的控制器/模块时,整个调度过程将在那里重复。
笔记:
如果你转发someAction()
到anotherAction()
你必须这样做
return $this->_forward('another');
您应该添加一个return
to,$this->_forward()
否则您当前的 Action 将在转发到另一个 Action 之前继续执行。
另请注意,将呈现的视图将是another.phtml
在进行重定向时,ZF 会指示浏览器加载http://example.com/controller-name/action-name作为_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...
}
}