如何将变量从一个动作传递到另一个动作而不重定向到Zend框架中的另一个动作(bsc)

时间:2012-11-06 15:19:31

标签: zend-framework

public function helloAction() {
    $a =10;

}
public function thanksAction() {
    $b = 20;
    $b = $b + $a; //`enter code here` how can i get this $a variable value from helloAction() to thanksAction()
// without use _redirect() and i mean don't send url helloAction() to thanksAction() by any method
}

在zend框架中提供解决方案。在这里输入代码`如何在不使用_redirect()的情况下从helloAction()到thanksAction()得到$ $变量值,我的意思是不要通过任何方法将url helloAction()发送到thanksAction()

3 个答案:

答案 0 :(得分:4)

有不同的选项,所有选项都取决于您的具体要求:

选项1:转发 - 从问题来看,看起来你想首先执行helloAction,然后是thanksAction(),以便将$ a设置为10,然后传递给thanksAction。为此,您可以使用_forward方法。它不会更改url,但会将执行传递给指定的操作。

       public function helloAction() {
               $a =10;
               $this->_forward("thanks","index", null, array('a' => $a));
        }
        public function thanksAction() {
               $a = $this->_getParam("a");
               $b = 20;
               $b = $b + $a; 
         }
 Note the _forward() will process all statements in helloAction(), skip its view script, and process all the statements in thanksAction and display its view script.`

选项2:将变量$ a设置为类参数,在操作中使用$ this访问它。

      public function helloAction() {
            $this->a =10;

      }
      public function thanksAction() {
            $b = 20;
            $b = $b + $this->a; 
      }

选项3:在会话或Zend注册表中设置值,并在需要的地方进行访问。

所有的说法和完成,正如@vascowhite在他的回答中所指出的,如果你遇到需要在动作之间传递参数而不是通过GET,POST或SESSION的情况,那么你可能会遇到一些设计问题。您可以做的一件事是将语句移动到常规函数并从helloAction调用它,如:

     public function helloAction() {
            $a =10;
            $c = $this->processA($a);

      }
      protected function processA($a) {
            $b = 20;
            $b = $b + $a; 
            return $b;
      }

答案 1 :(得分:3)

你不应该这样做。控制器永远不需要彼此交谈。如果存在多个控制器共有的功能,则应将其移动到其中一个模型层中。

你应该努力寻找具有最少逻辑的瘦控制器。您对一个控制器访问另一个控制器的要求是代码气味,表明您需要进行一些重新分解。对您的设计进行严格的批判性考察,并考虑如何避免这种情况,只有继续使用它才会变得更加复杂。

经过4年的ZF开发和10个已完成的项目作为单独的开发人员,我说的是痛苦的经历,特别是在维护旧项目时。我现在有一个牢不可破的规则,控制器永远不会共享任何东西。

答案 2 :(得分:0)

janenz00 几乎涵盖了所有内容,但我想补充一点,你不应该忘记每个控制器都是一个类,每个动作都是一个函数,可以这样调用。

      public function helloAction() {
            $a =10;
            $this->thanksAction($a);

      }
      public function thanksAction($a) {
            $b = 20;
            $b = $b + $a; 
      }

请注意,在ZF世界中,您正在执行helloAction,因此在两个操作完成后将显示的视图是hello视图。当不需要actionHelper时,您也可以使用它来处理控制器中的常见逻辑/验证/代码。