是否可以在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
作为简单继承的规则。
答案 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);