0

可能重复:
Zend 框架中重定向和转发有什么区别

我是zend框架的新手,当我尝试在控制器中使用foward、redirect、setViewRender时,它们有什么区别?

4

4 回答 4

2

正如官方文档所说:

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

阅读更多内容以更好地理解它。

于 2012-04-05T15:56:14.467 回答
0

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

于 2012-04-05T15:53:03.653 回答
0

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

好吧,对于 setViewRenderer,我真的很喜欢这个想法,我的意思是这有点像依赖注入。你真的不需要有一个默认视图,你可以为给定的动作提供一个新的视图。如果您对此进行研究,我认为您会得到最好的答案。

于 2012-04-05T16:53:45.117 回答
0

_forward是内部重定向。as_redirect发送一个标头,告诉客户端的浏览器转到其他 URL,_forward 告诉调度程序在内部将请求重定向到其他地方。

如果您考虑以下的正常发货顺序:

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

在该进程中的任何时候调用_forward都将导致以下步骤无法执行。所以如果你调用_forwardpreDispatch()someAction()不会被调用等等。如果您_forward()使用someAction()viewRenderer 操作助手来渲染视图(您让框架选择要渲染的视图脚本),则不会在someAction().

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

笔记:

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

return $this->_forward('another');

您应该添加一个returnto,$this->_forward()否则您当前的 Action 将在转发到另一个 Action 之前继续执行。

另请注意,将呈现的视图将是another.phtml

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

最后在一个动作中渲染一个特定的视图,使用viewRendererAction 助手:

 // 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...
        }

    }
于 2012-04-05T22:45:32.447 回答