代码之家  ›  专栏  ›  技术社区  ›  RageZ

Zend Framework,$this->\u forward在做什么

  •  21
  • RageZ  · 技术社区  · 16 年前

    我希望有人向我解释一下forward到底在做什么,我看不出forward是否也在呈现动作的附加视图,或者只是在执行动作。

    也可以将参数传递给$this->视图脚本中的操作?

    更一般地说,我的问题是如何编写确认页面,假设用户输入了一些东西,您想向他显示确认信息,那么转发是否意味着这种情况?

    5 回复  |  直到 12 年前
        1
  •  22
  •   smack0007    16 年前

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

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

     preDispatch()
     someAction()
     postDispatch()
    

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

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

    您可以使用以下命令了解正在调度的操作:

     $action = $this->getRequest()->getParam('action');
    

    $action将是操作的url形式,因此如果方法名为'someKindOfAction',$action将包含'someKindOfAction'。对于控制器和模块,您也可以这样做。

        2
  •  10
  •   Karim    16 年前

    我对Zend的经验是有限的,我希望我没有向你展示你已经看到的东西,但是 according to the docs (12.7.6.实用方法):

    如果在preDispatch()中调用,则将跳过当前请求的操作以支持新操作。否则,在处理当前操作后,将执行_forward()中请求的操作。

    所以这听起来像是什么时候叫做物质。在后一种情况下,它将首先执行调用它的操作 执行转发的操作。例外情况是从 预剥离 处理者

        3
  •  9
  •   Dan    16 年前

    我认为需要注意的是_forward非常低效,您应该始终直接调用您的方法。执行_forward时,init()、pre和post分派将再次运行。根据init中的内容,可以运行(并插入)相同的数据库记录两次。

    它很容易使用,但很浪费。如果你分析了你的代码,并且想弄明白为什么所有的东西都被调用了两次,\u forward就是原因。如果您喜欢我,并且您在init()中实例化了几个对象以在整个类中使用,那么您最终将实例化所有对象两次!我对代码进行了负载测试,并通过直接调用操作名(如foo())而不是_forward('foo'),获得了更好的性能;

        4
  •  3
  •   TomáÅ¡ Fejfar    16 年前

    当外部重定向不是正确选项时,将使用转发。 用例(有点僵硬,但我能做的最好):

    if($form->isValid($_POST)){  
      switch($form->select->getValue()){
        case "dog":
          $this->_forward('add-dog','pets','default');
          break;
        case "cat":
          $this->_forward('add-cat','pets','default');
          break;    
      }
    }
    

    你用不同的动作处理猫和狗的不同事情。这样做的好处是所有的参数都会一起发送。相比之下,当您使用$this时->_redirect()POST参数将丢失。在某些情况下,这是预期的行为(例如,在添加注释后,您重定向到注释列表页面,以避免重复发布和消息“页面需要再次发送数据…”。

        5
  •  2
  •   Justin    16 年前

    我曾经发誓,框架文档的一部分在一般层面上解释了分派工作流。有 this diagram ,但要解释forward所做的事情却非常复杂。

    在动作中,将设置“前进” $request->isDispatched = false ,并设置调用_forward中指定的控制器/操作的请求。在postDispatch期间,将检查isDispatched-如果其为false,则整个过程将使用新请求再次运行。

    [问题编辑后再编辑]

    $this->_helper->redirector->gotoUrl()

    推荐文章