在zend框架中调用其他控制器的成员函数?

时间:2009-05-20 05:29:48

标签: php zend-framework

是否可以在zend框架中调用另一个控制器的成员函数,如果是,那么如何?

<?php
class FirstController extends Zend_Controller_Action {
    public function indexAction() {
         // general action 
    }   

    public function memberFunction() {
         // a resuable function
    }
}

这是另一个控制器

<?php
class SecondController extends Zend_Controller_Action {
    public indexAction() {
         // here i need to call memberFunction() of FirstController
    }
}

请解释我如何从第二个控制器访问memberFunction()。

解决方案

更好的想法是定义AppController并使所有常用控制器扩展AppController,进一步扩展Zend_Controller_Action。

class AppController extends Zend_Controller_Action {
    public function memberFunction() {
         // a resuable function
    }
}

class FirstController extends AppController {
    public function indexAction() {
         // call function from any child class
         $this->memberFunction();
    } 
}

现在可以从扩展memberFunction的控制器调用AppController作为简单继承的规则。

3 个答案:

答案 0 :(得分:25)

控制器不是以这种方式使用的。如果要在当前控制器之后执行其他控制器操作,请使用_forward()方法:

// Invokes SecondController::otherActionAction() after the current action has been finished.
$this->_forward('other-action', 'second');

请注意,这仅适用于操作方法(“memberAction”),而不适用于任意成员函数!

如果SecondController::memberFunction()执行多个控制器所需的操作,请将该代码放在操作助手或库类中,以便两个控制器都可以访问共享功能而无需相互依赖。

答案 1 :(得分:5)

您应该考虑将代码分解为动作助手或模型,以便可以从需要它的两个控制器中调用它。

此致

...罗布

答案 2 :(得分:3)

我建议您关注DRY并将这些功能移到公共图书馆。例如,在库文件夹中创建

My/Util/ 

和文件

CommonFunctions.php

然后打电话给你的班级

My_Util_CommonFunctions

并定义你的方法

现在,您可以使用您必须注册的新命名空间从代码中的任何位置调用它们。

$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace(array('My_'));

在任何控制器中,您都可以使用以下方法调用自定义方法:

My_Util_CustomFunctions::yourCustomMethod($params);