Zend framework ZEND控制器--如何从其他控制器调用操作

Zend framework ZEND控制器--如何从其他控制器调用操作,zend-framework,zend-controller,Zend Framework,Zend Controller,我想显示一个包含两个表单的页面。顶部表单对此页面是唯一的,但底部表单已经可以从其他控制器呈现。我正在使用以下代码调用另一个窗体的操作,但不断出现此错误: "Message: id is not specified" #0 .../library/Zend/Controller/Router/Rewrite.php(441): Zend_Controller_Router_Route->assemble(Array, true, true) 第二控制器: abc_Controller publ

我想显示一个包含两个表单的页面。顶部表单对此页面是唯一的,但底部表单已经可以从其他控制器呈现。我正在使用以下代码调用另一个窗体的操作,但不断出现此错误:

"Message: id is not specified" #0 .../library/Zend/Controller/Router/Rewrite.php(441): Zend_Controller_Router_Route->assemble(Array, true, true) 第二控制器:

abc_Controller
public function someAction()
{

    $this->_helper->actionStack('other','xyz');

}
    xyz_Controller
 public function otherAction()
 {
 // code
 }
预期结果:

调用/abc/some时,我希望呈现“some”内容以及xyz/other内容。我认为我正确地遵循了doc(),但是找不到任何关于错误发生原因的帮助。当我跟踪代码(使用XDebug)时,xyz/other操作完成ok,但当abc/some操作结束时,错误会在调度或路由过程中抛出


非常感谢您的帮助

您可以使用第二个控制器创建新对象并调用其方法(但这不是最好的方法)

您可以使用第二个控制器扩展第一个控制器,并调用
$this->methodFromSecond()-它也将使用其模板呈现第二个表单


顺便说一句-您希望在两个控制器中执行哪种类型的代码?

您可以在phtml中完成这项操作。因此,在some.phtml put
中,这将使在XyzController的otherAction中找到的表单仅仅是一个更新。错误与如何从第二个控制器调用操作完全无关。事实证明,在第二个控制器的布局中,有一个单独的phtml调用抛出了错误(layout/abc.phtml):

我将单独调试此线程,以免弄脏此线程

感谢Akeem和hsz的及时回复。我从你的回答中学到了什么

总而言之,有3种不同的方式从外部控制器调用操作:

abc_Controller
public function someAction()
{

    $this->_helper->actionStack('other','xyz');

}
    xyz_Controller
 public function otherAction()
 {
 // code
 }
  • 从第一个控制器实例化第二个控制器并调用操作
  • 使用$this->\u helper->actionStack
  • 在第一个控制器的phtml中,action('other','xyz');?>(正如阿凯姆在上文中指出的那样)

  • 希望这能对其他Zend noobs有所帮助。

    这样做的冲动表明你的做法完全是错误的。如果您有重复使用内容的冲动,它很可能属于模型。如果它是真正的控制器代码,那么它应该由动作控制器插件封装

    Hm。我找不到并且不知道为什么需要在一个视图中使用不同的控制器。更好的做法是使用一个控制器。我在这个例子中使用了这个

    DemoController extends My_Controller_Action() {
     ....
     public function indexAction() {
       $this->view->oForm = new Form_Registration();
     }
    }
    
    My_Controller_Action extends Zend_Controller_Action() {
       public function init() {
          parent::init();
          $this->setGeneralStuf();
       }
    
       public function setGeneralStuf() {
           $this->view->oLoginForm = new Form_Login();
       }
    }
    

    在phtml文件中,您可以使用$this->action();要呈现页面,该响应将添加到当前响应中

    操作的语法如下所示:

    public function action($action, $controller, $module = null, array $params = array())
    

    这种路由定义:

    routes.abc.route = "abc/buy/:id/*" 
    routes.abc.defaults.controller = "deal" 
    routes.abc.defaults.action = "buy" 
    routes.abc.reqs.id = "\d+"
    
    需要一个参数才能正常工作。可以使用actionStack执行此操作,但如果未提供任何id,也可以指定默认id:

    $this->_helper->actionStack('Action',
                                'Controller',
                                'Route',
                                array('param' => 'value')
    );
    


    对我来说,这很有魅力

        class abcController extends Zend_Controller_Action
        {
            public function dashBoardAction()
            {
                $this->_helper->actionStack('list-User-Data', 'xyz');
            }
        }
    
        class XyzController extends Zend_Controller_Action {
            public function listUserDataAction()
            {
                $data = array('red','green','blue','yellow');
                return $data;
            }
        }
    

    实际上,从第一个控制器创建第二个控制器是我的第一次尝试。它返回完全相同的错误。至于执行的内容,第一个控制器呈现一个简单的表单——一个文本框(要购买的物品),第二个控制器调用另一个表单(系统其他部分使用的信用卡表单)。您使用Zend#u表单吗?如果是-可以在两个控制器中创建它们的对象,并将它们推送到视图中。这是干净的方式。如果您想以相同的方式处理它们(检查是否有效、在数据库中更新等),您应该为每个助手扩展
    Zend\u Controller\u Action\u Helper\u Abstract
    。在它们中,您可以在控制器中执行任何操作。我希望我能解释清楚是的,我在两个控制器上都使用Zend_表单。我尝试显式地创建对象,而不是使用_helper->actionStack,但结果是一样的。我想这一定和我的路线有关。我现在正在调查。我同意hsz,看我的回答。我也试过这个。同样的错误。奇怪的是,三种不同的方法都会出现相同的错误。我想知道这是否与我的routes配置文件有关:routes.abc.route=“abc/buy/:id/*”routes.abc.defaults.controller=“deal”routes.abc.defaults.action=“buy”routes.abc.reqs.id=“\d+”ActionStack助手允许您将请求推送到ActionStack前端控制器插件,有效地帮助您在请求期间创建要执行的操作队列。帮助程序允许您通过指定新的请求对象或操作-控制器-模块集来添加操作。_helper->actionStack()的参数如下:public function direct($action,$controller=null,$module=null,array$params=array())
        class abcController extends Zend_Controller_Action
        {
            public function dashBoardAction()
            {
                $this->_helper->actionStack('list-User-Data', 'xyz');
            }
        }
    
        class XyzController extends Zend_Controller_Action {
            public function listUserDataAction()
            {
                $data = array('red','green','blue','yellow');
                return $data;
            }
        }