2010-11-17 55 views
4

在使用ZF开发Web应用程序时,我有一个哈哈!关于Zend_Controller_Action中_forward方法的时刻。如the Programmer's Reference Guide中所述,当在动作中调用_forward方法时,在当前动作完成之前,所请求的动作将不会被执行。这引出了一个问题:Zend_Controller_Action _forward使用(或滥用)案例

除了表单处理(尽管您可能会将_forward请求放在操作结尾处),您何时会使用_forward动作来有意确保当前动作在启动之前完成?这有什么明确的例子?使用这种方法作为ActionStack的陷阱或优点?

+0

另见:[ActionStack on SO](http://stackoverflow.com/search?q=actionstack) – takeshin 2010-11-17 21:53:58

回答

4

_forward()只是替换Request对象中的模块/控制器/操作参数。

它只是允许改变你的想法(没有另一个请求)。

这具有不同的后果,取决于调用哪个调度循环状态。需要一些时间setDispatched()才能执行。

考虑这些情况:

第一:

$this->_forward('some') 

二:

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

三:

$this->someAction(); 
// ececuted? 

四:

return $this->someAction(); 
// executed? 
+0

+1的例子。我从未想到_forward('some')== $ this-> someAction()。然而,如果我不使用它作为退出点以及比ActionShack帮助器的优势/劣势,我真的很有兴趣知道何时使用它。 – Fatmuemoo 2010-11-17 20:03:12

+1

“ActionStack”的主要缺点是多次调用调度循环。当转发到不同的控制器时,你可以避免使用'return',或者在同一个控制器中使用'$ this-> someAction()'。我的建议:*总是返回*。它也适用于单元测试。 – takeshin 2010-11-17 21:51:30

0

你什么时候会用行动_forward故意确保您当前的动作开始另一个

我不认为它是用来让使用_forward()之前完成当前操作之前完成。这看起来更像是对您的域逻辑(模型,服务,类似的)的调用,而不是,它处理请求,这是一个操作。

yourAction 
    if(conditionsAreNotMet()) { 
    return _forward(anotherAction); 
    } 

我觉得_forward()提供给在你的行动的提前退出点(其逻辑全部集中在一件事情上,例如呈现新闻);而不需要执行另一个请求(如_redirect()),从而给Web服务器带来更多负担。

+0

啊哈!但它并不是一个退出点。如果您在动作中调用_forward(),它将不会转发,直到当前动作完成。您可以返回_forward退出,但只是调用_forward不会退出当前操作。 – Fatmuemoo 2010-11-17 16:15:10

+0

@Fatmuemoo:我同意你的观点,但早期的退出点是我曾经使用它的唯一原因,因为:如果我知道'_forward()'什么地方,那么我可能拥有处理请求的所有先决条件在同一个行动。我宁愿有一些模型/服务的重复调用,而不是命令一个'_forward()'我目前知道的一个动作**意味着我的第一个动作的逻辑延续,但可能会很好地改变,因为另一个动作永远不应该有任何依赖。也许我还没有看到真正的用例,你有吗? :) – chelmertz 2010-11-17 22:21:24

1

我真的只用_forward,原因有二:

  1. 我想重定向,但不希望用户的URL改变。

  2. 我想一些(非字符串)对象传递到另一个动作。

    $this->_forward('index', null, null, array('create_task_form' => $form));

在每种情况下,目标作用可以通过自身站立,而不始发,并且通常只是编组出的画面。

+0

在第二个示例中,您可以使用'$ this-> indexAction($ form)'。 – takeshin 2010-11-18 14:28:28